与产品ID不同

时间:2013-06-21 10:11:06

标签: c#

以下是我的课程。

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的记录中都相同。

2 个答案:

答案 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 的解决方案