2011-07-02 254 views
1

我對linq和c#很合理,所以如果我是愚蠢的,請道歉。我有一個查詢其帶回的產品信息列表,這些產品和類別的價格,這些產品都是基於一些變量中傳遞:當對象屬性重複時從對象列表中刪除項目

var y = (from pl in dc.Products 
       join pr in dc.Prices 
       on pl.ID equals pr.ProductID 
       join c in dc.Categories 
       on pl.ID equals c.ProductID 
       where pr.Currency == Currency 
       && (string.IsNullOrEmpty(Cat1) || c.Cat1 == Cat1) 
       && (string.IsNullOrEmpty(Cat2) || c.Cat2 == Cat2) 
       && (string.IsNullOrEmpty(Cat3) || c.Cat3 == Cat3) 
       && (string.IsNullOrEmpty(Cat4) || c.Cat4 == Cat4) 
       && (string.IsNullOrEmpty(Cat5) || c.Cat5 == Cat5) 
       select new {pl,pr,c}); 

這工作得很好,只要它去,但是比方說一y行有ID = 1,Cat1 = Foo,另一行ID = 1,Cat1 = Bar,那麼很顯然上面的查詢會帶回兩者。有沒有辦法修改這個查詢,這樣我就可以爲每個ID恢復一行。

我已經谷歌搜索了大約2個小時,並嘗試了group bys,用IEqualityComparer和其他我發現但沒有成功的方法。我的理解不夠好,我會很感激任何幫助!

回答

1

你應該做一個HashSet,其中的關鍵是你的財產。

List<Product> distinctProducts = new List<Product>(); 
HashSet<string> dupSet = new HashSet<string>(); 
foreach (Product p in Product) 
{ 
    if (dupSet.ContainsKey(p.Cat1)) 
    { 
     // do not add 
    } 
    else 
    { 
     dupSet.Add(p.Cat1); 
     distinctProducts.Add(p); 
    } 
} 

如果你想刪除原始列表中的項目,您可以使用一個for循環開始在結束(你不能刪除列表中的項目在for循環)。

+0

謝謝@peer我會試試看看我如何得到 – John

+0

我必須將ContainsKey()更改爲Contains(),但除此之外它完美地工作,謝謝。 – John