【问题标题】:Will Microsoft ever make all collections useable by LINQ?Microsoft 是否会让所有集合都可供 LINQ 使用?
【发布时间】:2011-01-15 22:10:58
【问题描述】:

我使用 LINQ 已经有一段时间了(并且很喜欢它),但是当我遇到 .NET 专用集合(DataRowCollection、ControlCollection)时,感觉就像遇到了障碍。有没有办法将 LINQ 与这些专用控件一起使用,如果没有,您认为 Microsoft 会在框架的下一个版本中解决这个问题吗?还是让我们以非 LINQ 方式迭代这些项目,或者我们自己将项目从集合中拉出到支持 LINQ 的集合中?

【问题讨论】:

    标签: c# linq collections controlcollection datarowcollection


    【解决方案1】:

    ControlCollection 之类的集合不能用于 LINQ 的原因是它们不是强类型的。没有元素类型 LINQ 无法创建强类型方法。只要您知道类型,就可以使用Cast 方法创建强类型枚举,从而与LINQ 一起使用。例如

    ControlCollection col = ...
    var query = col.Cast<Control>().Where(x => ...);
    

    至于微软是否会默认实现IEnumerable&lt;T&gt;。我的猜测是不在这里。这样做的原因是一个重大更改,并且可能导致代码中的预期行为。即使只是简单地为ControlCollection 实现IEnumerable&lt;Control&gt; 也会导致重载分辨率发生变化,这可能而且几乎肯定会破坏用户应用程序。

    【讨论】:

    • 这就是答案。忘记演员表了。 Microsoft 仍然可以为 ControlCollection 等添加强类型集合。谢谢你,感谢所有做出贡献的人。
    • 为什么微软确实没有将 ControlCollection 设为强类型集合(Control 类型)?
    【解决方案2】:

    原因是:没有实现IEnumerable&lt;T&gt;或IQueryable的集合,不能在LINQ中迭代

    【讨论】:

    • 好吧,所有集合都实现了 IEnumerable(否则你将无法遍历它们)。但是为了能够被 linq 使用,它们必须实现通用版本 (IEnumerable)。
    • 我提到了 IEnumerable 的通用版本,但 SOF(文本编辑器)不会让我这样做。早没注意到,已经改正了。感谢任何方式
    【解决方案3】:

    你应该可以做这样的事情:

    myDataRowCollection.Cast<DataRow>().Where.....
    

    并以这种方式使用 Linq。如果您知道集合中的对象是什么,那么您应该能够使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-07
      • 2010-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-03
      • 1970-01-01
      相关资源
      最近更新 更多