Вопрос по dictionary, c#, list – C # Преобразование списка <строка> в словарь <строка, строка>

87

Это может показаться странным, что нужно делать, но игнорируя это, есть хороший краткий способ преобразования списка в словарь, где каждая пара значений ключа в словаре - это просто каждая строка в списке. то есть

List = string1, string2, string3
Dictionary = string1/string1, string2/string2, string3/string3

Я провел много поисков, и есть только десятки примеров только на Stackoverflow, которые делали это в противоположном направлении, но не наоборот.

Причина для этого в том, что у меня есть два компонента третьей части, и их замена не в моих руках. Один возвращает список адресов электронной почты в виде списка, а другой отправляет электронные письма, где параметр To является словарем. Ключ словаря - это адрес электронной почты, а значение - их настоящее имя. Тем не менее, я не знаю настоящего имени, но оно все равно работает, если вы также установите настоящее имя в качестве адреса электронной почты. Поэтому, почему я хочу преобразовать список в словарь. Есть много способов сделать это. Цикл foreach в списке, который добавляет kvp в словарь. Но я люблю краткий код и задавался вопросом, было ли однострочное решение.

Более прямо, чем приведенные выше комментарии. Если вы объясните причину, по которой вы этого хотите, кто-то может предложить лучшее решение. Tim S.
Там нет лучшего решения. У меня есть сторонний компонент, который возвращает список строк, это адреса электронной почты. У меня есть другой сторонний компонент, который отправляет электронные письма, где он передает словарь & lt; string, string & gt; где ключ - адрес электронной почты, а значение - настоящее имя получателя. Однако реальное имя также может быть просто адресом электронной почты, поэтому я хочу преобразовать список & lt; string & gt; в словарь & lt; строка, строка & gt; Jonnster
Возможно, вы захотите узнать, HashSet & lt; & gt; соответствует вашим требованиям вместо использования словаря & lt;, & gt ;. Greg
У меня есть лучшее решение по вашей уважительной причине, честно. Will

Ваш Ответ

5   ответов
0

EDIT

Еще один способ справиться с дубликатом, вы можете сделать это

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); 

but make sure that there is no string is repeating...again otherewise above code will not work for you

if there is string is repeating than its better to do like this

Dictionary<string,string> dic= new Dictionary<string,string> ();

    foreach(string s in Stringlist)
    {
       if(!dic.ContainsKey(s))
       {
        //  dic.Add( value to dictionary
      }
    }
178

Попробуй это:

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 Чтобы прокомментировать действительную причину, я думаю, что единственная причина, которая может быть действительной для таких преобразований, состоит в том, что в какой-то момент ключи и значения в результирующем словаре будут расходиться. Например, вы должны выполнить первоначальное преобразование, а затем заменить некоторые значения чем-то другим. Если ключи и значенияalways будет то же самое,HashSet<String> будет гораздо лучше подходить для вашей ситуации:

var res = new HashSet<string>(list);
if (res.Contains("string1")) ...
Благодарю. Я пропустил функцию ToDictionary. Спасибо всем, кто в основном дал такой же ответ. Я проголосовал за всех, но могу принять только один ответ. Этот был только один с добавленным кодом Distinct, поэтому был наиболее полным, на мой взгляд. Jonnster
@PranayRana Да, было бы. Можете добавить.Distinct() послеlist чтобы избежать этого.
это не удастся, если список похож на строку1, строку2, строку3, строку1
9

Использовать этот:

var dict = list.ToDictionary(x => x);

УвидетьMSDN для получения дополнительной информации.

Как указывает Pranay в комментариях, это не удастся, если элемент присутствует в списке несколько раз.
В зависимости от ваших конкретных требований, вы можете использоватьvar dict = list.Distinct().ToDictionary(x => x); чтобы получить словарь отдельных предметов или вы можете использоватьToLookup вместо:

var dict = list.ToLookup(x => x);

Это вернетILookup<string, string> который по сути такой же, какIDictionary<string, IEnumerable<string>>, так что у вас будет список различных ключей с каждым экземпляром строки под ним.

@PranayRana: Вы правы. Починил это.
это не удастся, если список похож на строку1, строку2, строку3, строку1
1

ИспользуяToDictionary:

var dictionary = list.ToDictionary(s => s);

Если возможно, что любая строка может быть повторена, либо выполнитеDistinct сначала вызвать в списке (чтобы удалить дубликаты) или использоватьToLookup что позволяет использовать несколько значений для каждого ключа.

0

var dictionary = myList.ToDictionary(x => x);

Похожие вопросы