Distinct()返回List<>返回副本
本文关键字:返回 副本 List Distinct | 更新日期: 2023-09-27 18:14:57
我有一个过滤器列表,传递到一个web服务,我迭代集合,做Linq查询,然后添加到产品列表,但当我做一个GroupBy
和Distinct()
它不删除重复。我使用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>
}
您需要重写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;
}