Это может показаться странным, но, игнорируя это, существует ли хороший краткий способ преобразования списка в словарь, где каждая пара значений ключа в словаре - это просто каждая строка в списке. т.е.
List = string1, string2, string3
Dictionary = string1/string1, string2/string2, string3/string3
Я провел много поисков, и только на Stackoverflow есть буквально десятки примеров, когда это делается в противоположном направлении, но не в этом направлении.
Причина в том, что у меня есть два третьих компонента, и изменить их не в моих руках. Один возвращает список адресов электронной почты в виде списка, а другой отправляет электронные письма, в которых параметр To является словарем. Ключом словаря является адрес электронной почты, а значением - их настоящее имя. Однако я не знаю настоящего имени, но он по-прежнему работает, если вы также установите настоящее имя в адрес электронной почты. Поэтому почему я хочу преобразовать список в словарь. Есть много способов сделать это. Цикл foreach в списке, который добавляет kvp в словарь. Но мне нравится лаконичный код, и мне было интересно, есть ли однострочное решение.
источник
Ответы:
Попробуй это:
Первая лямбда позволяет вам выбрать ключ, вторая - значение.
Вы можете поиграть с ним и сделать значения отличными от ключей, например:
Если в вашем списке есть дубликаты, добавьте
Distinct()
следующее:ИЗМЕНИТЬ Чтобы прокомментировать действительную причину, я думаю, что единственная причина, которая может быть действительной для подобных преобразований, заключается в том, что в какой-то момент ключи и значения в результирующем словаре будут расходиться. Например, вы должны выполнить первоначальное преобразование, а затем заменить некоторые значения на что-то другое. Если ключи и значения всегда будут одинаковыми, это
HashSet<String>
будет намного лучше для вашей ситуации:источник
.Distinct()
после,list
чтобы избежать этого.Использовать это:
См. MSDN для получения дополнительной информации.
Как указывает Пранай в комментариях, это не удастся, если элемент существует в списке несколько раз.
В зависимости от ваших конкретных требований вы можете либо использовать
var dict = list.Distinct().ToDictionary(x => x);
для получения словаря отдельных элементов, либоToLookup
вместо этого:Это вернет,
ILookup<string, string>
который по сути такой же, какIDictionary<string, IEnumerable<string>>
, поэтому у вас будет список отдельных ключей с каждым экземпляром строки под ним.источник
Используя
ToDictionary
:Если возможно, что любая строка может повторяться, либо
Distinct
сначала выполните вызов в списке (для удаления дубликатов), либо используйте,ToLookup
который позволяет использовать несколько значений для каждого ключа.источник
Ты можешь использовать:
источник
РЕДАКТИРОВАТЬ
другой способ справиться с дублированием - это сделать так
или
простой способ сделать это
но убедитесь, что строка не повторяется ... опять же, иначе приведенный выше код не будет работать для вас
если есть повторяющаяся строка, то лучше сделать так
источник