2013-06-21 35 views
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的記錄中都是相同的。

+2

如果有多個條目具有相同的ID,您是哪一個要取? –

+2

爲什麼你會有多個具有相同ID的條目?如果它是相同的ID,它應該是同一個對象,否則它不是真的和ID。 – Bikonja

+1

儘管@Spender可以給出你需要的答案,但我仍然覺得設計有問題。具有不同數量的相同產品ID聽起來不錯。例如。在現實世界的情況下,如果你購買2包麪包,你不會看到在麪包包數量1價格5美元和麪包包數量1價格5美元兩倍的法案。而你會看到像麪包包數量2價格10美元的東西。您的場景與示例中的第一個場景類似。雖然它不在話題中,但我只想指出,你仍然可以重新設計它。 – srsyogesh

回答

1

您可以實現一個相等比較器。在msdn上有一個很好的例子:http://msdn.microsoft.com/ru-ru/library/bb338049.aspx

這會給你更多的控制你認爲哪些項目等於。但涉及更多的編碼。如果你想從所有共享ID的項目中選擇單一的,有點隨機項,那麼你會用富豪的解決方案

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) 

更加有用,或許是一個查詢,使總數量爲每產品按產品編號排序:

items 
    .GroupBy(x => x.ProductId) 
    .Select(g => new MyGroceryListItems{ 
         g.Key.ProductId, 
         g.Key.ProductName, 
         Quantity = g.Sum(gg => gg.Quantity) 
       }) 
+0

thanx爲你的幫助,解決了我的問題! –

相關問題