0

下面是我的课。

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 的记录中并非所有条目都相同。

4

2 回答 2

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)
                })
于 2013-06-21T10:16:17.633 回答
1

您可以实现一个相等比较器。msdn上有一个可靠的例子:http: //msdn.microsoft.com/ru-ru/library/bb338049.aspx

这将使您更好地控制您认为相等的项目。但涉及更多编码。如果您想从共享一个 id 的所有项目中选择单个且有些随机的项目,那么使用spender的解决方案会更好

于 2013-06-21T10:15:55.640 回答