LINQ是否可以与IEnumerable一起使用?


86

我有一个实现IEnumerable但没有实现的类IEnumerable<T>。我不能更改此类,也不能使用其他类代替它。正如我从MSDN所了解的,如果使用类实现,则可以使用LINQIEnumerable<T>。我尝试使用instance.ToQueryable(),但是它仍然不启用LINQ方法。我肯定知道该类只能包含一种类型的实例,因此该类可以实现IEnumerable<T>,但事实并非如此。那么,如何使用LINQ表达式查询此类?


在不强制转换IEnumerable的情况下,而不是所有linq方法,您只会看到8个方法:AsQueryable,Cast <>,Equals,GetEnumerator,GetHashCode,GetType,
OfType

Answers:


134

您可以使用Cast<T>()OfType<T>获取完全支持LINQ的IEnumerable的通用版本。

例如。

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

或者,如果您不知道其包含的类型,则可以随时执行以下操作:

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

如果您的非泛型IEnumerable包含各种类型的对象,而您仅对例如。您可以执行的字符串:

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

2
每天,我都会学习有关LINQ的新知识。每天,我越来越喜欢它。
若奥·门德斯

11

是的,它可以。您只需要使用该Cast<T>函数即可将其转换为typed IEnumerable<T>。例如:

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

现在e2IEnumerable<T>,可以使用所有LINQ功能。


3

您还可以使用LINQ的查询理解语法,item如果指定了类型,则该语法将转换为range变量的类型(在此示例中):

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);
}

效果与@JaredPar的解决方案相同;有关详细信息,请参见C#语言规范中的7.16.2.2:显式范围变量类型

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.