C# 如何在ToDictionary强制转换中获得重复密钥?
我必须在我的应用程序中将一个列表强制转换到字典中,但我收到一个错误消息说,“已经添加了一个具有相同键的项”。但它是一个包含超过5k个对象的列表,我需要查看哪些对象具有相同键。有办法吗? 在消息异常中,我无法获取它,因此我认为我可以使用foreach或其他工具来完成它。 有什么建议吗? 谢谢 编辑:C# 如何在ToDictionary强制转换中获得重复密钥?,c#,.net,collections,C#,.net,Collections,我必须在我的应用程序中将一个列表强制转换到字典中,但我收到一个错误消息说,“已经添加了一个具有相同键的项”。但它是一个包含超过5k个对象的列表,我需要查看哪些对象具有相同键。有办法吗? 在消息异常中,我无法获取它,因此我认为我可以使用foreach或其他工具来完成它。 有什么建议吗? 谢谢 编辑: 此目标集合是一个通用IEnumerable,是我从第三方数据库获取的密钥,因此我没有访问它的权限。解决方案是找到有问题的对象,并将其告知供应商。您可以使用LINQ捕获重复的对象。然后,您可以按照自己的
此目标集合是一个通用IEnumerable,是我从第三方数据库获取的密钥,因此我没有访问它的权限。解决方案是找到有问题的对象,并将其告知供应商。您可以使用LINQ捕获重复的对象。然后,您可以按照自己的意愿处理它们 创建一个不包含重复项的词典
var duplicates = myList.GroupBy(x => x.SomeKey).Where(x => x.Count() > 1);
var dictionaryWithoutDups = myList
.Except(duplicates.SelectMany(x => x))
.ToDictionary(x => x.SomeKey);
创建只包含每个副本的第一个副本的词典
var groups = myList.GroupBy(x => x.SomeKey);
var dictionaryWithFirsts = groups.Select(x => x.First()).ToDictionary(x => x.SomeKey);
如果你只是在找DUP
HashSet<string> hs = new HashSet<string>();
foreach(string s in myList) if(!hs.Add(s)) Debug.WriteLine("dup: " + s);
HashSet hs=newhashset();
foreach(myList中的字符串s)如果(!hs.Add(s))Debug.WriteLine(“dup:+s”);
如果您想处理,也可以将hs改为Dictionary
Dictionary<string, myclass> dl = new Dictionary<string, myclass>();
foreach(string s in myList)
{
if(dl.ContainsKey(s))
{
Debug.WriteLine("dup: " + s);
}
else
{
dl.Add(s, null);
}
}
Dictionary dl=newdictionary();
foreach(myList中的字符串s)
{
如果(dl.CONTANSKEY)
{
Debug.WriteLine(“dup:+s”);
}
其他的
{
dl.添加(s,空);
}
}
我知道你接受了LINQ的回答,但LINQ不会比你做得更好 如果您想保留副本,可以改用。它创建了一个
ILookup
,它基本上是一个只读字典
,其中重复项作为“值”存储在集合中。列表中的项目是什么?你目前是如何将列表转换成词典的?你可以在ToDictionary
之前使用Distinct
这样的方法来确保你没有重复的内容,但是你的问题没有提供足够的信息来解决问题。@DanielBrückner我做了编辑。谢谢你不需要字典,你只想知道有重复键的项目,对吗?@NathanA是的,我只是自己查了一下。你可以把它简化为if(!hs.Add(s)){Debug.WriteLine(“dup:+s);}
因为Add
将告诉您该项是否已经存在。@DanielBrückner同意,但Dictionary.Add不起作用,我希望代码可以双向执行。
var badGroups = collection.GroupBy(item => item.Key)
.Where(group => group.Count() > 1);
foreach (var badGroup in badGroups)
{
Console.WriteLine("The key {0} appears {1} times.", badGroup.Key, badGroup.Count());
forach (var badItem in badGroup)
{
Console.WriteLine(badItem);
}
}
var goodItems = collection.GroupBy(item => item.Key)
.Where(group => group.Count() == 1)
.SelectMany(group => group);
foreach (var goodItem in goodItems)
{
Console.WriteLine("The key {0} appears exactly once.", goodItem.Key);
}
var dictionary = goodItems.ToDictionary(item => item.Key);
var badGroups = collection.GroupBy(item => item.Key)
.Where(group => group.Count() > 1);
foreach (var badGroup in badGroups)
{
Console.WriteLine("The key {0} appears {1} times.", badGroup.Key, badGroup.Count());
forach (var badItem in badGroup)
{
Console.WriteLine(badItem);
}
}
var goodItems = collection.GroupBy(item => item.Key)
.Where(group => group.Count() == 1)
.SelectMany(group => group);
foreach (var goodItem in goodItems)
{
Console.WriteLine("The key {0} appears exactly once.", goodItem.Key);
}
var dictionary = goodItems.ToDictionary(item => item.Key);