#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