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