LINQ có hoạt động với IEnumerable không?


87

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


Nếu không truyền IEnumerable, thay vì tất cả các phương thức linq, bạn sẽ chỉ thấy 8 phương thức: AsQueryable, Cast <>, Equals, GetEnumerator, GetHashCode, GetType, OfType <>, ToString
ShawnFeatherly

Câu trả lời:


134

Bạn có thể sử dụng Cast<T>()hoặc tải OfType<T>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 nó chứa loại nào, bạn luôn có thể làm:

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

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

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

2
Mỗi ngày, tôi học được điều gì đó mới về LINQ. Mỗi ngày, tôi càng yêu thích nó hơn.
João Mendes

11

Có nó có thể. Bạn chỉ cần sử dụng Cast<T>hàm để chuyển đổi nó sang dạng đã gõ IEnumerable<T>. Ví dụ:

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

Now e2là một IEnumerable<T>và có thể hoạt động với tất cả các hàm LINQ.


3

Bạn cũng có thể sử dụng cú pháp hiểu truy vấn của LINQ, cú pháp chuyển thành kiểu của biến phạm vi ( itemtrong ví dụ này) nếu một kiểu được chỉ đị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 với giải pháp của @ JaredPar; xem 7.16.2.2: Các loại biến phạm vi rõ ràng trong đặc tả ngôn ngữ C # để biết chi tiết.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.