代码之家  ›  专栏  ›  技术社区  ›  AndreasN

带自定义基本集合的Linq

  •  7
  • AndreasN  · 技术社区  · 17 年前

    在使用自定义集合对象时,我经常发现Linq有问题。 它们通常被防御为

    基本系列

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

    集合定义为

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

    有没有比 添加范围还是浓度?

    var products = from p in HugeProductCollection
                   where p.Vendor = currentVendor
                   select p;
    PruductCollection objVendorProducts = new PruductCollection();
    objVendorProducts.AddRange(products);
    

    如果从Linq查询返回的对象是我的自定义集合类型,那就太好了。因为您似乎需要枚举集合两次才能做到这一点。

    编辑 : 在阅读了答案之后,我认为最好的解决方案是实现一个topProduct()扩展。 想知道C 4.0中的协方差/反方差是否有助于解决这些问题。

    3 回复  |  直到 17 年前
        1
  •  7
  •   neontapir    14 年前

    问题是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();
    
        2
  •  2
  •   bruno conde    17 年前

    我可以建议您一种不必枚举集合2次的方法:

    abstract class BaseCollection<T> : List<T>
    {
        public BaseCollection(IEnumerable<T> collection)
            : base(collection)
        {
        }
    }
    
    class PruductCollection : BaseCollection<Product>
    {
        public PruductCollection(IEnumerable<Product> collection)
            : base(collection)
        {
        }
    }
    
    var products = from p in HugeProductCollection
                   where p.Vendor = currentVendor
                   select p;
    PruductCollection objVendorProducts = new PruductCollection(products);
    
        3
  •  -1
  •   user2262324    13 年前

    这个可以和绑定列表一起使用吗?as bindingList没有一个构造函数,该构造函数将采用IEnumerable,但确实实现了它。

    绑定列表:collection、ibindinglist、ilist、icolection、ienumerable、icanceladdnew、iraiseItemChangedEvents