2010-06-30 86 views
1

我需要从dictonary删除指定的项目从Dictonary项目..如何删除在C#中使用LINQ

的dictonary就像

 dict["Key1"]="Value1" 
     dict["Key2"]="Value2" 
     dict["Key3"]="Value3" 
     dict["Key4"]="Value2" 

如何在另一个项目中删除该项目具有使用LINQ

在此先感谢

+1

你要什么要删除的项目,与密钥2项或有Key4的那个? – 2010-06-30 06:41:34

+0

检查更新后的答案 – 2010-06-30 06:42:34

+0

@ David_001:Key 4 – 2010-06-30 06:51:23

回答

3

这里我测试的解决方案:

dict.GroupBy(x => x.Value, x => x.Key) 
.Where(x => x.Count() > 1) 
.SelectMany(x => x.Skip(1)) 
.ToList().ForEach(x => dict.Remove(x)) 
+0

这个答案其实很聪明。不知道有关“选择此”参数的GroupBy。 – 2010-06-30 07:05:37

0

您需要使用Distinct相同的值。

+0

@ Incognito:谢谢你......你是对的,但我需要在创建dictonary之后删除重复项。 – 2010-06-30 06:33:55

+0

&Pramodh,你是不正确的,distinct不会帮助你过滤基于对象属性的集合,并仍然使用相关的属性。 – 2010-06-30 06:47:21

+0

您是否检查了链接。这不是SQL独特的。你可以在现有的字典上使用它。 – Incognito 2010-06-30 06:47:37

3

检查原单由@乔恩飞碟双向回答:C#: Remove duplicate values from dictionary?

var uniqueValues = myDict.GroupBy(pair => pair.Value) 
         .Select(group => group.First()) 
         .ToDictionary(pair => pair.Key, pair => pair.Value); 
1
var dupKeys = dict.GroupBy(innerD => innerD.Value) 
       .Where(mergedByValue => mergedByValue.Count() > 1) 
       .Select(mergedByValue => mergedByValue.OrderByDescending(m => m.Key).First().Key); 

dict.Where(d => dupKeys.Contains(d.Key)).ToList() 
    .ForEach(d => dict.Remove(d.Key)); 

这是假设你想要的最后重复删除,其中最后被定义为最后的序数字符串值。

如果你想删除所有重复,你dupKeys改成这样:

var dupKeys = dict.GroupBy(innerD => innerD.Value) 
       .Where(mergedByValue => mergedByValue.Count() > 1).Dump() 
       .SelectMany(mergedByValue => mergedByValue.Select(m => m.Key));