2014-01-07 275 views
2

最簡單的方法從擴展方法做到這一點,也許? :初始化字典<字符串,字符串>自List <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(...)'而不是'dictionary [...] = ...'具有在鍵被複制時拋出適當異常的優點。 –

+0

@TomBlodget:真。將添加一個註釋。 –

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 - 你可以先郵編名單本身:

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); 
相關問題