2015-06-09 28 views
-2

刪除重複如何使用LINQ的語句從尋找這樣的字典中刪除所有重複:從對象字典,根據財產價值

Dictionary<Type1, Type2>() 

2型包含字符串屬性ID。我想刪除具有相同ID的所有條目

+0

字典的概念是類型1 /鍵包含唯一的ID – fubo

+0

我想刪除具有相同Value.id所有條目,並保持只有一個 –

+0

什麼是選擇該副本,以保持標準?如果我們有兩個條目:<1,"abc">和<2, "abc">,我們取出一個用鑰匙1或2? – Gerino

回答

2

您可以將您想要,然後拿到第一個值匹配(或全部)特定領域的詞典:

Dictionary<Type1, Type2> d = new Dictionary<Type1, Type2>(); 

var entriesToBeRemoved = d.GroupBy(x => x.Value.SomeId) 
         .SelectMany(x => x.Skip(1)) 
         .ToList() 
         ; 

foreach (var kvp in entriesToBeRemoved) 
{ 
    d.Remove(kvp.Key); 
} 

或者,如果你不在乎創造結果的新字典:

Dictionary<Type1, Type2> d = new Dictionary<Type1, Type2>(); 

var d2 = d.GroupBy(x => x.Value.SomeId) 
      .ToDictionary(x => x.First().Key, x => x.First().Value) 
      ; 
+0

,因爲他需要一個不同的值,同時保留鍵 –

+1

這個伎倆。謝謝! (看起來太複雜壽:))我也想通了,它需要g.First()鍵,而不是g.Key –

+0

難道不應該是'.ToDictionary(X => x.First()。重點,x => x.First()。Value)'?否則'd2'是'Dictionary '。 – juharr

1

,你需要這應該工作正是:

var removables = 
    dict 
     .ToLookup(x => x.Value.ID, x => x.Key) 
     .SelectMany(x => x.Skip(1)) 
     .ToArray(); 

foreach (var key in removables) 
{ 
    dict.Remove(key); 
} 
+0

如果您執行'ToList'而不是'ToArray',則可以使用'List '上的'ForEach'方法來作爲單個語句的一部分進行刪除。 –

+0

@ LasseV.Karlsen - 還有一個'Array.ForEach(...)'方法。我很想使用那個,但我覺得在這種情況下,對於OP來說,一個簡單的'foreach'會更好。 – Enigmativity

+0

感謝您在我的回答中給予的幫助。 +1給你。 –