2014-01-07 1 views
2

Самый простой способ сделать это, возможно, из метода расширения? :Инициализировать словарь <строка, строка> из списка <string>

var MyDic = new Dictionary<string,string>{ "key1", "val1", "key2", "val2", ...}; 

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

+0

Что вы хотите, чтобы произошло, когда ключ я s 'null' или два ключа равны или список имеет нечетную длину? Обработка этих проблем будет определять код. –

+0

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

ответ

10

Чередование - это немного боль. Лично я бы просто сделать это обыкновенное письмо:

var dictionary = new Dictionary<string, string>(); 
for (int index = 0; index < list.Count; index += 2) 
{ 
    dictionary[list[index]] = list[index + 1]; 
} 

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

(Очевидно, что вы можете обернуть, что вверх в метод расширения.)

Обратите внимание, что вы можете использовать dictionary.Add(list[index], list[index + 1]) бросить исключение, если есть дубликаты ключей - приведенный выше код будет молча использовать последнее возникновения конкретный ключ.

+1

+1 за то, что он отдает предпочтение методу длинной руки старой школы по сравнению с симпатичным, но менее читаемым кодом. – DonBoitnott

+0

'dictionary.Add (...)' вместо словаря [...] = ... 'имеет преимущество бросать соответствующее исключение, когда ключи дублируются. –

+0

@TomBlodget: True. Добавит примечание. –

1

Вы можете использовать диапазон, который составляет половину длины списка и ToDictionary для создания словаря из элементов списка:

Dictionary<string, string> dictionary = 
    Enumerable.Range(0, list.Count/2) 
    .ToDictionary(i => list[i * 2], i => list[i * 2 + 1]); 
+1

Должно быть 'list.Count'. Нет 'list.Length'. –

+0

@GrantWinney: Конечно. Спасибо, что заметили это. – Guffa

1

Если вам нужно LINQ - вы можете ZiP список себе первый:

var result = list.Where((item, id) => id % 2 == 0) 
    .Zip (list.Where((item, id) => id % 2 == 1), 
      (key, value) => new KeyValuePair<string,string>(key, value)) 
    .ToDictionary(p => p.Key, p => p.Value); 
2

LINQ и GroupBy версия:

var dict = source.Select((s, i) => new { s, i }) 
       .GroupBy(x => x.i/2) 
       .ToDictionary(g => g.First().s, g => g.Last().s); 
Смежные вопросы