У меня есть список объектов Person. Я хочу преобразовать в словарь, где ключ - это имя и фамилия (объединенные), а значение - объект Person.
Проблема в том, что у меня есть несколько дублированных людей, поэтому это взрывается, если я использую этот код:
private Dictionary<string, Person> _people = new Dictionary<string, Person>();
_people = personList.ToDictionary(
e => e.FirstandLastName,
StringComparer.OrdinalIgnoreCase);
Я знаю, это звучит странно, но мне пока не нужны дубликаты имен. Если есть несколько имен, я просто хочу получить одно. В любом случае я могу написать этот код выше, так что он просто берет одно из имен и не взрывается на дубликаты?
c#
linq
dictionary
Лиора
источник
источник
Dictionary<string, List<Person>>
(или эквивалент).Distinct
Ответы:
Вот очевидное решение, отличное от linq:
источник
Решение LINQ:
Если вы предпочитаете не-LINQ решение, вы можете сделать что-то вроде этого:
источник
Решение Linq с использованием Distinct () и без группировки:
Я не знаю, является ли это лучше, чем решение LukeH, но оно также работает.
источник
Это должно работать с лямбда-выражением:
источник
personList.Distinct().ToDictionary(i => i.FirstandLastName, i => i);
Вы также можете использовать
ToLookup
функцию LINQ, которую затем можно использовать почти взаимозаменяемо со словарем.Это, по сути, сделает GroupBy в ответе LukeH , но даст хеширование, которое обеспечивает словарь. Таким образом, вам, вероятно, не нужно преобразовывать его в словарь, а просто использовать
First
функцию LINQ всякий раз, когда вам нужно получить доступ к значению ключа.источник
Вы можете создать метод расширения, аналогичный ToDictionary (), с той разницей, что он допускает дублирование. Что-то вроде:
В этом случае, если есть дубликаты, выигрывает последнее значение.
источник
Чтобы обработать устранение дубликатов, внедрите метод,
IEqualityComparer<Person>
который можно использовать вDistinct()
методе, и тогда получить ваш словарь будет легко. Дано:Получите ваш словарь:
источник
источник
В случае, если мы хотим, чтобы весь Person (а не только один Person) в возвращаемом словаре, мы могли бы:
источник
Проблема с большинством других ответов является то , что они используют
Distinct
,GroupBy
илиToLookup
, что создает дополнительный словарь под капотом. Также ToUpper создает дополнительную строку. Это то, что я сделал, это почти точная копия кода Microsoft, за исключением одного изменения:Поскольку набор в индексаторе заставляет его добавлять ключ, он не будет выбрасывать, а также будет выполнять только один поиск ключа. Вы также можете дать ему
IEqualityComparer
, например,StringComparer.OrdinalIgnoreCase
источник
Начиная с решения Карры, вы также можете написать его так:
источник