2013-01-21 62 views
0

我有一个字典对象是这样的:检查字典是否有相同的值的关键

CustomKeys<int, string> 

如;

1000, F1 
1001, F2 
1002, F1 
1003, F4 
1004, F2 

我想知道在这本词典中是否有超过1个相同的值。我也想记下哪些键(唯一的ID)有重复。

这可能吗?

+3

'键',那是什么? Keys是你的一些自定义类型吗? – svick

+1

当字典被修改或者只是一次性快照时,您是否想保留重复列表的运行列表? – squillman

+0

你的字典有多大? – MatthewJ

回答

3

你可以找到它们具有相同值的所有键值,

Dictionary<int, string> d = new Dictionary<int, string>(); 
    d.Add(1000, "F1"); 
    d.Add(1001, "F2"); 
    d.Add(1002, "F1"); 
    d.Add(1003, "F4"); 
    d.Add(1004, "F2"); 

    var dublicate = d.ToLookup(x => x.Value, x => x.Key).Where(x => x.Count() > 1); 

    foreach (var i in dublicate) 
    { 
     Console.WriteLine(i.Key); 
    } 

这是DEMO

但是如果你想得到一个boolean价值,因为你的物品有相同的价值,看看Magnus's answer这是伟大的。

+1

我期待着一个基于LINQ的答案与Lambdas :)在这里! +1 –

+0

如果您想计算重复一次,这非常有用。但是这个问题说:“我想保留一个注释......”,我认为这意味着重复列表应该始终可用,没有复杂的操作就可以在每次使用它时创建它。 – svick

+0

@svick是的,我有点误解了这个问题,因为这个问题不好解释不好。 –

4

有可能使用GroupByCount() > 1来跟踪哪些值有重复。

var q = dic.GroupBy(x => x.Value) 
     .Select (x => new { Item = x, HasDuplicates = x.Count() > 1 }); 
+0

你的意思是'Item = x.Key'? – svick

+0

@svick,当然也可以。 – Magnus

1

我不知道用你的意思是“保持纸条,上面有重复值”的东西。如果你的意思是保持音符键,你可以这样做:

 var keys = new Dictionary<int, string>(); 
     keys.Add(1000, "F1"); 
     keys.Add(1001, "F2"); 
     keys.Add(1002, "F1"); 
     keys.Add(1003, "F4"); 
     keys.Add(1004, "F2"); 

     var duplicates = keys.GroupBy(i => i.Value).Select(i => new 
     { 
      keys = i.Select(x => x.Key), 
      value = i.Key, 
      count = i.Count() 
     }); 

     foreach (var duplicate in duplicates) 
     { 
      Console.WriteLine("Value: {0} Count: {1}", duplicate.value, duplicate.count); 
      foreach (var key in duplicate.keys) 
      { 
       Console.WriteLine(" - {0}", key); 
      } 
     } 

如果你的意思是只跟踪重复值,请参阅Sonor的答案。

1

另一种解决办法是:

var duplicates = dictionary.GroupBy(g => g.Value) 
          .Where(x => x.Count() > 1) 
          .Select(x => new { Item = x.First(), Count = x.Count() }) 
          .ToList(); 
相关问题