如何在ToDictionary演员表中获取重复键?

时间:2014-05-15 17:10:24

标签: c# .net collections

我必须在我的应用程序中将列表强制转换为字典,但是我收到错误消息说"已经添加了具有相同密钥的项目"。但它是一个包含超过5k个对象的列表,我需要看到具有相同键的对象。有没有办法做到这一点? 在消息异常中,我无法得到它,所以我认为我可以使用foreach或其他东西。 有什么建议? 谢谢!

编辑:

   var targetDictionary = targetCollection.ToDictionary(k => k.Key);

此目标集合是一个通用的IEnumerable,而我从第三方数据库获取的密钥,因此我无法访问它。解决方案是找到有问题的对象并告诉供应商。

4 个答案:

答案 0 :(得分:7)

您可以使用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);

答案 1 :(得分:3)

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);

答案 2 :(得分:1)

如果您只是在寻找重复

HashSet<string> hs = new HashSet<string>();   
foreach(string s in myList) if(!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);
   }
}

我看到你接受了一个LINQ答案,但LINQ不打算执行此操作。

答案 3 :(得分:1)

如果您想保留重复项,可以使用.ToLookup代替。它会创建一个ILookup<TKey, TValue>,它基本上是只读Dictionary<TKey, IEnumerable<TValue>>,其中重复项存储为集合中的“值”。