2011-10-13 36 views
59

Tôi có một lớp thực hiện IEnumerable nhưng không triển khai IEnumerable<T>. Tôi không thể thay đổi lớp này, và tôi không thể sử dụng một lớp khác thay vì nó. Như tôi đã hiểu từ MSDN LINQ can be used if class implements IEnumerable<T>. Tôi đã thử sử dụng instance.ToQueryable(), nhưng nó vẫn không cho phép phương pháp LINQ. Tôi biết chắc chắn rằng lớp này có thể chứa các cá thể chỉ có một kiểu, vì vậy lớp có thể thực hiện IEnumerable<T>, nhưng nó không có. Vậy tôi có thể làm gì để truy vấn lớp này bằng cách sử dụng các biểu thức LINQ?LINQ có hoạt động với IEnumerable không?

+0

Without đúc các IEnumerable, thay vì tất cả các phương pháp LINQ bạn sẽ chỉ thấy 8 phương pháp: AsQueryable , Cast <>, Equals, GetEnumerator, GetHashCode, GetType, OfType <>, ToString – ShawnFeatherly

Trả lời

101

Bạn có thể sử dụng Cast<T>() hoặc OfType<T> để nhận phiên bản chung của IEnumerable hỗ trợ đầy đủ LINQ.

Ví dụ:

IEnumerable objects = ...; 
IEnumerable<string> strings = objects.Cast<string>(); 

Hoặc nếu bạn không biết những gì loại nó chứa bạn luôn có thể làm:

IEnumerable<object> e = objects.Cast<object>(); 

Nếu bạn không chung IEnumerable chứa các đối tượng của các loại khác nhau và bạn chỉ quan tâm đến ví dụ. các dây bạn có thể làm:

IEnumerable<string> strings = objects.OfType<string>(); 
9

Có thể. Bạn chỉ cần sử dụng chức năng Cast để chuyển nó thành kiểu được nhập IEnumerable<T>. Ví dụ

IEnumerable e = ...; 
IEnumreable<object> e2 = e.Cast<object>(); 

Bây giờ e2 là một IEnumerable<T> và có thể làm việc với tất cả các chức năng LINQ.

3

Bạn cũng có thể sử dụng cú pháp LINQ của hiểu truy vấn, trong đó phôi để loại biến phạm vi (item trong ví dụ này) nếu một loại được quy định:

IEnumerable list = new ArrayList { "dog", "cat" }; 

IEnumerable<string> result = 
    from string item in list 
    select item; 

foreach (string s in result) 
{ 
    // InvalidCastException at runtime if element is not a string 

    Console.WriteLine(s); 
} 

Hiệu ứng giống hệt với giải pháp của @ JaredPar; xem 7.16.2.2: Loại biến thể phạm vi rõ ràng trong đặc tả ngôn ngữ C# để biết chi tiết.

-1

Có Nó,

tôi sẽ cung cấp cho bạn ví dụ ngắn để hiểu bạn tốt hơn

List<Student> obj = new List<Student>(); 
     obj.Add(new Student() { name = "xyz", roll = 12, school = "pqr" }); 
     obj.Add(new Student() { name = "xyz", roll = 12, school = "pqr" }); 
     obj.Add(new Student() { name = "xyz", roll = 12, school = "pqr" }); 
     obj.Add(new Student() { name = "xyz", roll = 12, school = "pqr" }); 
     obj.Add(new Student() { name = "xyz", roll = 12, school = "pqr" }); 


     IEnumerable<Student> students = from x in obj.AsEnumerable() 
             select x; 


     foreach (var item in students) 
     { 
      MessageBox.Show(item.name); 
     } 



    class Student 
     { 
      public string name { get; set; } 
      public int roll { get; set; } 
      public string school { get; set; } 
     } 
+0

'Danh sách ' đã thực hiện 'IEnumerable ' mà OP đặc biệt nói đối tượng của chúng không. – MEMark

Các vấn đề liên quan