2015-12-21 3 views
-2

Например, в IList У меня есть три словари со следующими ключами:Получить от IList <Dictionary <строка, объект >> ключи, которые существуют во всех словарях от IList

словарных 1 ключи:

aaÃ

AAA1

AAA2

словарь 2 ключи:

ааа

AAA1

Баа3

bbb4

словарь 3 ключи:

ааа

Баа3

bbb4

В результате мне нужно получить следующий список ключей с помощью LINQ:

ааа

Может кто-нибудь помочь?

ответ

0

Вот что вам нужно сделать:

var result = list 
    .SelectMany(l => l.Keys) 
    .Distinct() 
    .Where(k => list.All(l => l.ContainsKey(k))) 
    .ToList(); 

или построить на решении @ ken2k (который может иметь лучшую производительность):

var duplicatedKeys = myList 
    .SelectMany(z => z.Keys) 
    .GroupBy(z => z) 
    .Where(z => z.Count() == myList.Count) //Number of items in group should be equal to the number of dictionaries in the list 
    .Select(z => z.Key) 
    .ToList(); 
+0

Спасибо!) Это работа) –

6

GroupBy должно быть достаточно, чтобы выделить группы ключей, которые содержат более одного элемента:

var duplicatedKeys = myList 
    .SelectMany(z => z.Keys) // Flattens the keys to a unique IEnumerable 
    .GroupBy(z => z)   // Group keys by key 
    .Where(z => z.Count() > 1) // Get groups with more than 1 occurence 
    .Select(z => z.Key)   // Get the actual key 
    .ToList(); 
+0

Это то же самое, что и var duplicatedKeys = myList .SelectMany (z => z.Keys) .Distinct(); Я получаю все ключи от всех словарей. Мне нужно получить только те ключи, которые повторяются во всех словарях. –

+0

Это решение вернет ключи, которые существуют в двух или более словарях. OP хочет получить ключи, которые существуют в * all * словарях. –

+2

@YacoubMassad Вопрос OP был изменен после того, как я опубликовал этот ответ. Исходный пример, обозначенный 'aaa1', должен быть возвращен, но он отсутствовал во всех словарях. – ken2k

3
var set = new HashSet<string>(); 
var duplicates = list 
        .SelectMany(x => x.Keys) 
        .Where(x => !set.Add(x)); 
+1

Лучше всего добавить комментарий, а не просто бросить код. –

Смежные вопросы