我必须在我的应用程序中将列表强制转换为字典,但是我收到错误消息说"已经添加了具有相同密钥的项目"。但它是一个包含超过5k个对象的列表,我需要看到具有相同键的对象。有没有办法做到这一点? 在消息异常中,我无法得到它,所以我认为我可以使用foreach或其他东西。 有什么建议? 谢谢!
编辑:
var targetDictionary = targetCollection.ToDictionary(k => k.Key);
此目标集合是一个通用的IEnumerable,而我从第三方数据库获取的密钥,因此我无法访问它。解决方案是找到有问题的对象并告诉供应商。
答案 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更改为DictionaryDictionary<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>>
,其中重复项存储为集合中的“值”。