С# Преобразовать список <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);