C# 如何在ToDictionary强制转换中获得重复密钥?

C# 如何在ToDictionary强制转换中获得重复密钥?,c#,.net,collections,C#,.net,Collections,我必须在我的应用程序中将一个列表强制转换到字典中,但我收到一个错误消息说,“已经添加了一个具有相同键的项”。但它是一个包含超过5k个对象的列表,我需要查看哪些对象具有相同键。有办法吗? 在消息异常中,我无法获取它,因此我认为我可以使用foreach或其他工具来完成它。 有什么建议吗? 谢谢 编辑: 此目标集合是一个通用IEnumerable,是我从第三方数据库获取的密钥,因此我没有访问它的权限。解决方案是找到有问题的对象,并将其告知供应商。您可以使用LINQ捕获重复的对象。然后,您可以按照自己的

我必须在我的应用程序中将一个列表强制转换到字典中,但我收到一个错误消息说,“已经添加了一个具有相同键的项”。但它是一个包含超过5k个对象的列表,我需要查看哪些对象具有相同键。有办法吗? 在消息异常中,我无法获取它,因此我认为我可以使用foreach或其他工具来完成它。 有什么建议吗? 谢谢

编辑:


此目标集合是一个通用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);