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