2015-06-09 21 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给你。 –