LINQ是否与IEnumerable一起使用?

时间:2011-10-13 16:34:57

标签: .net linq ienumerable

我有一个实现IEnumerable的类,但没有实现IEnumerable<T>。我不能改变这个类,我不能使用另一个类而不是它。正如我从MSDN LINQ can be used if class implements IEnumerable<T>所了解的那样。我尝试使用instance.ToQueryable(),但它仍然没有启用LINQ方法。我确信这个类只能包含一种类型的实例,因此该类可以实现IEnumerable<T>,但它不会。那么我该怎么做才能使用LINQ表达式查询这个类?

3 个答案:

答案 0 :(得分:120)

您可以使用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>();

答案 1 :(得分:10)

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

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

现在e2IEnumerable<T>,可以使用所有LINQ函数。

答案 2 :(得分:3)

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

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:显式范围变量类型