2010-05-31 2 views
4

У меня есть код, который возвращает уникальные элементы в моем словаре, но я также хотел бы вернуть количество повторяющихся элементов. В основном сменить словарь [ключ, uniqueelement] на словарь [uniqueelement, count]. Вот мой код, который просто возвращает уникальные элементы.Использование LINQ для удаления дубликатов в словаре и подсчета этих дубликатов

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

ответ

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); 
} 
+0

FYI, вызов Выберите непосредственно перед ToDictionary не требуется –

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