2012-03-29 48 views
7

我有一個列表,我想將其放入字典中,爲了簡單起見,插入的值將全部相同。帶有ContainsKey的c#ToDictionary檢查

我可以使用foreach循環。

List<string> list = new List<string>(); 
    list.Add("Earth"); 
    list.Add("Wind"); 
    list.Add("Fire"); 
    list.Add("Water"); 
    list.Add("Water"); // Will NOT BE INSERTED using the foreach loop 

    var myDictionary= new Dictionary<string, int>(); 
    foreach (string value in list) 
    { 
     if (!myDictionary.ContainsKey(value)) 
     { 
     myDictionary.Add(value, 1); 
     } 
    } 

上述工作。

但我想用ToDictionary做同樣通過以下方式 -

Dictionary<string, int> myDictionary2 = list.ToDictionary(i => i, i => 1); 

當然這失敗,因爲我加入「水」的兩倍。

使用ToDictionary時檢查重複條目的正確方法是什麼?

回答

14

你可以使用Distinct()過濾掉重複:

Dictionary<string, int> myDictionary2 = list.Distinct().ToDictionary(i => i, i => 1); 

同樣的方法可以使你的傳統循環更加清晰得,因爲你沒有選中「手動」爲重複:

foreach (string value in list.Distinct()) 
{ 
    myDictionary.Add(value, 1); 
} 
+6

這將工作,但我想知道如果OP真的想要一套。 – Gabe 2012-03-29 18:49:55

+0

@加貝:不確定我不明白你在這個問題中的意見 - 你能澄清嗎? – BrokenGlass 2012-03-29 18:51:11

+1

所有值爲1的字典基本上只是一個集合。如果用戶從不訪問這些值,則不需要實際的字典。 – Gabe 2012-03-29 18:57:49

7

Distinct是避免重複密鑰問題的一個選項。如果你需要重複計數,可以按如下嘗試更多的東西像這樣GroupBy

var dict = list.GroupBy(i => i).ToDictionary(g => g.Key, g => g.Count()); 

如果您的申請不只是一個簡單的字符串列表/重複計數結構,你可能會從選擇獲得一些里程像Lookup這樣的不同結構,您可以通過撥打ToLookup擴展名獲得 - 或者可以使用上面使用的GroupBy這樣的分組。