c# - 带有自定义基础集合的 Linq

标签 c# linq

在处理自定义集合对象时,我经常发现 linq 有问题。 它们通常被定义为

基础集合

abstract class BaseCollection<T> : List<T> { ... }

集合定义为

class PruductCollection : BaseCollection<Product> { ... }

有没有比将 linq expession 的结果添加到这个集合更好的方法 添加范围还是连接?

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,通过 IEnumerable<T> 上的扩展方法,知道如何构建数组、列表和字典,它不知道如何构建自定义集合。你可以让你的自定义集合有一个接受 IEnumerable<T> 的构造函数或者你可以写信给你。前者允许您直接在构造函数中使用 LINQ 结果,后者允许您使用扩展修饰 LINQ 语句并取回您想要的集合。无论哪种方式,您都需要在构造函数或扩展中进行某种从通用集合到专用集合的转换。或者你可以两者都做...

public static class MyExtensions
{
     public static ProductCollection
                      ToProducts( this IEnumerable<Product> collection )
     {
          return new ProductCollection( collection );
     }
}


public class ProductCollection : BaseCollection<Product>
{
     ...

     public ProductCollection( IEnumerable<Product> collection )
              : base( collection )
     {
     }

     ...
 }


var products = (from p in HugeProductCollection
                where p.Vendor = currentVendor
                select p).ToProducts();

关于c# - 带有自定义基础集合的 Linq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/371174/

相关文章:

c# - 我可以用什么让用户建立自己的头像角色?

c# - 如何在 WPF 中为自定义 TextBox 控件指定 CornerRadius?

c# - 如何使用 NSubstitute 模拟带有私有(private) setter 的属性

vb.net - 带索引的 Select 重载的查询符号

c# - 将 Expression<Func<IBar, T>> 转换为 Expression<Func<Bar, T>>

linq - GroupBy 使用 LINQ 但基于另一列的不同,并且仍然能够计算其他记录

c# - Linq 检查 where 子句中的百分比

c# - Invoke() 和 BeginInvoke() 有什么区别

c# - PIxelFormat之间如何相互转换?

c# - 当编译时类型未知时,将对象动态转换为类型