Distinct()返回List<>返回副本

本文关键字:返回 副本 List Distinct | 更新日期: 2023-09-27 18:14:57

我有一个过滤器列表,传递到一个web服务,我迭代集合,做Linq查询,然后添加到产品列表,但当我做一个GroupByDistinct()它不删除重复。我使用IEnumerable,因为当你使用Disinct时,它会将其转换为IEnumerable。如果你知道如何更好地构建这个,并使我的函数返回List<Product>类型,将不胜感激,谢谢。

下面是我的c#代码:

if (Tab == "All-Items")
{
    List<Product> temp = new List<Product>();
    List<Product> Products2 = new List<Product>();
    foreach (Filter filter in Filters)
    {                        
        List<Product> products = (from p in db.Products where p.Discontinued == false
                                  && p.DepartmentId == qDepartment.Id
                                  join f in db.Filters on p.Id equals f.ProductId
                                  join x in db.ProductImages on p.Id equals x.ProductId
                                  where x.Dimension == "180X180"
                                  && f.Name == filter.Name /*Filter*/
                                  select new Product
                                  {
                                      Id = p.Id,
                                      Title = p.Title,
                                      ShortDescription = p.ShortDescription,
                                      Brand = p.Brand,
                                      Model = p.Model,
                                      Image = x.Path,
                                      FriendlyUrl = p.FriendlyUrl,
                                      SellPrice = p.SellPrice,
                                      DiscountPercentage = p.DiscountPercentage,
                                      Votes = p.Votes,
                                      TotalRating = p.TotalRating
                                  }).ToList<Product>();
        foreach (Product p in products)
        {
            temp.Add(p);
        }                        
        IEnumerable temp2 = temp.GroupBy(x => x.Id).Distinct();
        IEnumerator e = temp.GetEnumerator();
        while (e.MoveNext()) {
            Product c = e.Current as Product;
            Products2.Add(c);
        }
    }
    pf.Products = Products2;// return type must be List<Product>                
}

Distinct()返回List<>返回副本

您需要重写Equals GetHashCode 来比较Product s的值

您将GroupBy结果分配给temp2,但此后您从未使用它!

IEnumerable temp2 = temp.GroupBy(x => x.Id).Distinct();         
IEnumerator e = temp.GetEnumerator();   // <- why temp and not temp2???

但是你并没有真正正确地使用GroupBy运算符。您需要分组,然后从每个组中选择一个项目,而不是选择不同的组。组已经不同

当你按Id分组时,你会返回一个像这样的结构

-Key: 1
   -Product (Id = 1)
-Key: 2
   -Product (Id = 2)
   -Product (Id = 2)

需要从每个组检索一个项。假设是重复的,您不会关心您得到的是哪个项目,因此您可以从每个组中取出第一个项目。

var groups = temp.GroupBy(x => x.Id);
var distinctItems = groups.Select(g => g.First());
foreach (var item in distinctItems)
{
    // do stuff with item
    Products2.Add(item);
}

SLaks是对的,您必须重写Equals()和GetHashCode()方法来完成此操作。

下面是我如何在我编写的小程序中的Order对象中实现它的。希望这对你有帮助!
    //overridden Equals() method from the Object class, determines equality based on order number
    public override bool Equals(object obj)
    {
        bool equal;
        if (this.GetType() != obj.GetType())
            equal = false;
        else
        {
            Order temp = (Order)obj;
            if(OrderNumber == temp.OrderNumber)
                equal = true;
            else
                equal = false;
        }
        return equal;
    }
    //overridden GetHashCode() method from Object class, sets the unquie identifier to OrderNumber
    public override int GetHashCode()
    {
        return OrderNumber;
    }