【问题标题】:Does LINQ work with IEnumerable?LINQ 可以与 IEnumerable 一起使用吗?
【发布时间】:2011-12-07 03:02:49
【问题描述】:

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

【问题讨论】:

  • 不强制转换 IEnumerable,而不是所有 linq 方法,您只会看到 8 个方法:AsQueryable、Cast、Equals、GetEnumerator、GetHashCode、GetType、OfType、ToString

标签: .net linq ienumerable


【解决方案1】:

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

【讨论】:

  • 每天,我都会学到一些关于 LINQ 的新知识。每一天,我都越来越喜欢它。
【解决方案2】:

是的,它可以。您只需要使用Cast&lt;T&gt; 函数将其转换为类型化的IEnumerable&lt;T&gt;。例如:

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

现在e2 是IEnumerable&lt;T&gt; 并且可以使用所有LINQ 函数。

【讨论】:

    【解决方案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:显式范围变量类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-15
      • 2018-02-16
      • 2020-06-30
      • 2014-11-15
      相关资源
      最近更新 更多