Фильтровать словарь<Строка,список>

#c# #list #linq #dictionary

#c# #Список #linq #словарь

Вопрос:

У меня есть Dictionary<String, List<String>> и мне нужно его отфильтровать, и и оставить только те пары, в которых List<String> содержатся повторяющиеся значения (дубликаты). Я понимаю, что должен быть подзапрос linq, но все мои варианты терпят неудачу.

Пример:

 var dictionary = new Dictionary<String,List<String>>();

dictionary.Add("Key1", new List<String>{"1","2","2","3"});
dictionary.Add("Key2", new List<String>{"1","2","3"});
dictionary.Add("Key3", new List<String>{"1","2","4"});
dictionary.Add("Key4", new List<String>{"1","2","5"});
  

Итак, мне нужно оставить только первую пару, потому что в этом списке есть дубликаты для значения «2».

Комментарии:

1. Возможно, вы захотите предоставить пример входных и ожидаемых выходных данных. Трудно сказать, находится ли дубликат в одном списке или в разных списках.

2. @JohnMcCann Спасибо тебе за совет.

3. Вы могли бы использовать distinct для создания другого списка, затем сравнить свой список с ним, чтобы исключить совпадающие строки..

Ответ №1:

Вашего словаря:

  • принимать все пары ключ-значение
  • из них возьмите только те, в которых список после удаления дубликатов больше не содержит того же количества элементов (таким образом, в нем были дубликаты)
  • а затем создать новый словарь из оставшихся пар ключ-значение

Код:

 var filteredDictionary = dictionary.Where(pair => pair.Value.Distinct().Count()
                                               != pair.Value.Count)
                                   .ToDictionary(x => x.Key, x => x.Value);
  

Комментарии:

1. Мне нравится ваш подход. Я пытался использовать GroupBy с Count() > 1. Ваше решение проще.

2. огромное спасибо! Теперь я лучше понимаю логику linq