首页 > 解决方案 > 如何使用简单的 linq 获得不同的多列?

问题描述

我有一个产品列表,例如:

List<Product> products = new List<Product>();
products.Add( new Product{ ProductID=1,Category="Food",SubCategory="Snacks",Location="Tokyo"});

products.Add( new Product{ ProductID=1,Category="Food",SubCategory="Snacks",Location="Tokyo"});

products.Add( new Product{ ProductID=1,Category="Food",SubCategory="Snacks",Location="Tokyo"});

我需要一个简单的查询来查找产品的不同记录。我正在做类似的事情:

products.Select(x=>x.ProductID||x=>x.Category||x=>x.SubCategory).Distinct().ToList();

标签: c#linq

解决方案


Distinct运算符有一个重载,它需要一个,IEqualityComparer<T>因此您可以更改Product以实现它:

class Product : IEqualityComparer<Product>
{
    public int ProductID { get; internal set; }
    public string Category { get; internal set; }
    public string SubCategory { get; internal set; }
    public string Location { get; internal set; }

    public bool Equals(Product x, Product y)
    {
        return
            x.Category.Equals(y.Category) &&
            x.Location.Equals(y.Location) &&
            x.SubCategory.Equals(y.SubCategory);
    }

    public int GetHashCode(Product obj)
    {
        return ProductID;
    }
}

然后您的查询可以像这样工作:

var distinctProducts =
    (from product in products
     select product)
    .Distinct(new Product())
    .ToList();

请注意,我传递了一个 的实例Product,它实现IEqualityComparer<Product>Distinct


推荐阅读