以下是我的课程。
public class MyGroceryListItems
{
public int ProductId { get; set; }
public string ProductName { get; set; }
public int Quantity { get; set; }
}
现在我从数据库中获取此类的值并将这些类放在IList<MyGroceryListItems>
中。但是,有一些重复的项目具有相同的id
但数量不同。如何通过id
仅获取不同的条目?
我尝试了list.distinct,但是没有用,因为并非所有条目在具有相同产品ID的记录中都相同。
答案 0 :(得分:4)
IEnumerable<MyGroceryListItems> items = ...;
var uniqueItemsByProdId =
items.GroupBy(x => x.ProductId).Select(g => g.First());
如果多个项目与另一个项目共享一个ProductId,这将挑选一个(并且有点武断)项目。
或者(稍快),您可以使用DistinctBy
扩展程序:
public static IEnumerable<T>
DistinctBy<T,TKey>(this IEnumerable<T> src, Func<T,TKey> selector)
{
HashSet<TKey> hs = new HashSet<TKey>();
foreach(var item in src)
{
//Add returns false if item is already in set
if(hs.Add(selector(item)))
{
yield return item;
}
}
}
像这样:
items.DistinctBy(x => x.ProductId)
更有用的可能是一个查询,它通过ProductId给出每个项目的总量:
items
.GroupBy(x => x.ProductId)
.Select(g => new MyGroceryListItems{
g.Key.ProductId,
g.Key.ProductName,
Quantity = g.Sum(gg => gg.Quantity)
})
答案 1 :(得分:1)
您可以实现相等比较器。在msdn上有一个很好的例子:http://msdn.microsoft.com/ru-ru/library/bb338049.aspx
这样可以更好地控制您认为相等的项目。但涉及更多编码。如果你想从所有共享id的项目中选择单个和有点随机的项目,那么你最好使用 spender 的解决方案