我有一个字典对象是这样的:检查字典是否有相同的值的关键
CustomKeys<int, string>
如;
1000, F1
1001, F2
1002, F1
1003, F4
1004, F2
我想知道在这本词典中是否有超过1个相同的值。我也想记下哪些键(唯一的ID)有重复。
这可能吗?
我有一个字典对象是这样的:检查字典是否有相同的值的关键
CustomKeys<int, string>
如;
1000, F1
1001, F2
1002, F1
1003, F4
1004, F2
我想知道在这本词典中是否有超过1个相同的值。我也想记下哪些键(唯一的ID)有重复。
这可能吗?
你可以找到它们具有相同值的所有键值,
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这是伟大的。
我期待着一个基于LINQ的答案与Lambdas :)在这里! +1 –
如果您想计算重复一次,这非常有用。但是这个问题说:“我想保留一个注释......”,我认为这意味着重复列表应该始终可用,没有复杂的操作就可以在每次使用它时创建它。 – svick
@svick是的,我有点误解了这个问题,因为这个问题不好解释不好。 –
我不知道用你的意思是“保持纸条,上面有重复值”的东西。如果你的意思是保持音符键,你可以这样做:
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的答案。
另一种解决办法是:
var duplicates = dictionary.GroupBy(g => g.Value)
.Where(x => x.Count() > 1)
.Select(x => new { Item = x.First(), Count = x.Count() })
.ToList();
'键',那是什么? Keys是你的一些自定义类型吗? –
svick
当字典被修改或者只是一次性快照时,您是否想保留重复列表的运行列表? – squillman
你的字典有多大? – MatthewJ