我有一个这样的字典对象:
CustomKeys<int, string>
例如;
1000, F1
1001, F2
1002, F1
1003, F4
1004, F2
我想知道这本词典中是否有超过1个相同的值。我还想记下哪些键(唯一ID)有重复。
这可能吗?
答案 0 :(得分:4)
可以使用GroupBy
而不是Count() > 1
来跟踪哪些值有重复。
var q = dic.GroupBy(x => x.Value)
.Select (x => new { Item = x, HasDuplicates = x.Count() > 1 });
答案 1 :(得分: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,这很棒。
答案 2 :(得分: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的答案。
答案 3 :(得分:1)
另一种解决方案可能是:
var duplicates = dictionary.GroupBy( g => g.Value )
.Where( x => x.Count( ) > 1 )
.Select( x => new { Item = x.First( ), Count = x.Count( ) } )
.ToList( );