【发布时间】:2008-12-16 12:37:55
【问题描述】:
在使用自定义集合对象时,我经常发现 linq 存在问题。 他们经常被辩护为
基础集合
abstract class BaseCollection<T> : List<T> { ... }
集合被定义为
class PruductCollection : BaseCollection<Product> { ... }
有没有更好的方法将 linq expession 的结果添加到此集合中? addrange 还是 concat?
var products = from p in HugeProductCollection
where p.Vendor = currentVendor
select p;
PruductCollection objVendorProducts = new PruductCollection();
objVendorProducts.AddRange(products);
如果从 linq 查询返回的对象是我的自定义集合类型,那就太好了。因为您似乎需要枚举集合两次才能执行此操作。
编辑: 阅读答案后,我认为最好的解决方案是实现 ToProduct() 扩展。 想知道 c#4.0 中的协变/逆变是否有助于解决这类问题。
【问题讨论】:
-
“您似乎需要枚举集合两次才能执行此操作。” -- 由于大多数 linq 查询都是惰性求值的,因此集合只会在 AddRange 调用期间被枚举一次。
-
这解决了我的问题,但我不确定我缺少什么,因为我认为不需要这个临时
BaseCollection<T>。它的目的是什么?