С# Преобразовать список <string> в словарь <string, string>
Это может показаться странным делом, но, не обращая внимания на это, есть хороший лаконичный способ преобразования списка в словарь, где каждая пара значений ключа в словаре - это только каждая строка в списке. то есть.
List = string1, string2, string3
Dictionary = string1/string1, string2/string2, string3/string3
Я сделал много поиска, и есть буквально десятки примеров только на Stackoverflow, делающих это в противоположном направлении, но не так.
Причина этого заключается в том, что у меня есть две компоненты третьей части, и изменение их из моих рук. Один возвращает список адресов электронной почты в виде списка, а другой отправляет электронные письма, где параметр To - это словарь. Ключ словаря - это адрес электронной почты, а значение - это его настоящее имя. Тем не менее, я не знаю настоящего имени, но он по-прежнему работает, если вы также укажете настоящее имя на адрес электронной почты. Поэтому я хочу преобразовать список в словарь. Есть много способов сделать это. Цикл foreach в списке, который добавляет kvp в словарь. Но я люблю сложный код и задаюсь вопросом, существует ли однолинейное решение.
Ответы
Ответ 1
Попробуйте следующее:
var res = list.ToDictionary(x => x, x => x);
Первая лямбда позволяет выбрать ключ, второй выбирает значение.
Вы можете играть с ним и отличать значения от клавиш, например:
var res = list.ToDictionary(x => x, x => string.Format("Val: {0}", x));
Если ваш список содержит дубликаты, добавьте Distinct()
следующим образом:
var res = list.Distinct().ToDictionary(x => x, x => x);
EDIT Чтобы прокомментировать действительную причину, я думаю, что единственная причина, которая может быть действительной для таких конверсий, заключается в том, что в какой-то момент ключи и значения в результирующем словаре будут расходиться. Например, вы сделали бы первоначальное преобразование, а затем замените некоторые из значений на что-то еще. Если ключи и значения всегда будут одинаковыми, HashSet<String>
обеспечит гораздо лучшую подгонку вашей ситуации:
var res = new HashSet<string>(list);
if (res.Contains("string1")) ...
Ответ 2
Используйте это:
var dict = list.ToDictionary(x => x);
Подробнее см. MSDN.
Как указывает Праняй в комментариях, это не удастся, если элемент существует в списке несколько раз.
В зависимости от ваших конкретных требований вы можете использовать var dict = list.Distinct().ToDictionary(x => x);
для получения словаря отдельных элементов или вместо него использовать ToLookup
:
var dict = list.ToLookup(x => x);
Это вернет ILookup<string, string>
, который по существу совпадает с IDictionary<string, IEnumerable<string>>
, поэтому у вас будет список отдельных ключей с каждым экземпляром строки под ним.
Ответ 3
Используя ToDictionary
:
var dictionary = list.ToDictionary(s => s);
Если возможно, что любая строка может быть повторена, либо сначала выполните вызов Distinct
в списке (чтобы удалить дубликаты), или используйте ToLookup
, который позволяет использовать несколько значений для каждого ключа.
Ответ 4
ИЗМЕНИТЬ
Другой способ справиться с дубликатом - вы можете сделать это
var dic = slist.Select((element, index)=> new{element,index} )
.ToDictionary(ele=>ele.index.ToString(), ele=>ele.element);
или
простой способ сделать это
var res = list.ToDictionary(str => str, str=> str);
, но убедитесь, что строка не повторяется... снова, иначе код выше не будет работать для вас
, если строка повторяется, чем ее лучше сделать
Dictionary<string,string> dic= new Dictionary<string,string> ();
foreach(string s in Stringlist)
{
if(!dic.ContainsKey(s))
{
// dic.Add( value to dictionary
}
}
Ответ 5
Вы можете использовать:
var dictionary = myList.ToDictionary(x => x);