微软是否会让所有系列都可以被LINQ使用?

时间:2010-02-11 21:59:56

标签: c# linq collections controlcollection datarowcollection

我一直在使用LINQ(并且喜欢它),但是当我遇到.NET专用集合(DataRowCollection,ControlCollection)时,感觉就像我遇到了一个speedbump。有没有办法将LINQ与这些专用控件一起使用,如果不是,您认为Microsoft会在下一版本的框架中解决这个问题吗?或者我们是否继续迭代这些非LINQ方式,或者将项目从集合中拉出到LINQ-able系列中?

3 个答案:

答案 0 :(得分:22)

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

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

至于Microsoft是否会默认实现这些IEnumerable<T>。我的猜测不在这里。之所以这样做是一个突破性的变化,可能导致代码中的预期行为。即使只为IEnumerable<Control>实施ControlCollection,也会导致更改过载解决方案,这种解决方案可能并且几乎肯定会破坏用户应用程序。

答案 1 :(得分:4)

你应该可以这样做:

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

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

答案 2 :(得分:1)

原因是:没有实现IEnumerable<T>或IQueryable的集合无法在LINQ中迭代