使用LINQ在字典中删除重复项并计算这些重复项的数量

4

我有一些代码可以返回字典中的唯一元素,但我也想返回重复元素的计数。基本上将dictionary[key, uniqueelement]更改为dictionary[uniqueelement, count]。以下是仅返回唯一元素的代码。

var uniqueItems = deviceInstances.Children.GroupBy(pair => pair.Value.Information.UnderlyingDeviceType)
                  .Select(group => group.First())
                  .ToDictionary(pair => pair.Key, pair => pair.Value.Information.UnderlyingDeviceType.ToString());
2个回答

6

基于您已经拥有的内容

var uniqueItems = deviceInstances.Children.GroupBy(pair => pair.Value.Information.UnderlyingDeviceType) 
                  .Select(group => new { Pair = group.First(), Count = group.Count() }) 
                  .ToDictionary(g => g.Pair.Value.Information.UnderlyingDeviceType.ToString(), g => g.Count); 

根据这个演示:
Dictionary<int, string> dictionary = new Dictionary<int, string>();
dictionary.Add(1, "Alpha");
dictionary.Add(2, "Bravo");
dictionary.Add(3, "Charlie");
dictionary.Add(4, "Alpha");
dictionary.Add(5, "Bravo");
dictionary.Add(6, "Alpha");

var uniqueItems = dictionary
    .GroupBy(kvp => kvp.Value)
    .Select(g => new { g.Key, Count = g.Count() })
    .ToDictionary(g => g.Key, g => g.Count);

foreach (var kvp in uniqueItems)
{
    Console.WriteLine("{0}\t{1}", kvp.Key, kvp.Value);
}

请注意,在ToDictionary之前调用Select并不是必需的。 - Nathan Baulch

0
Dictionary<T, U> source = GetDictionary();

List<IGrouping<U, T> valueGroupList = source
  .GroupBy(kvp => kvp.Value, kvp => kvp.Key)
  .ToList();

Dictionary<T, U> withoutDupes = valueGroupList
  .Where(g => !g.Skip(1).Any())
  .ToDictionary(g => g.First(), g.Key);

Dictionary<U, int> dupesWithCount = valueGroupList
  .Where(g => g.Skip(1).Any())
  .ToDictionary(g.Key, g.Count())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接