2012-03-29 4 views
7

私は辞書に入れたいリストを持っていますが、簡単にするために、挿入される値はすべて同じになります。c#ToDictionary with ContainsKeyチェック

私は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

+0

@Gabe:質問の文脈であなたのコメントを理解していないか分かりませんか? – BrokenGlass

+1

すべての値が1である辞書は基本的に単なる集合です。ユーザーが決して値にアクセスしない場合、実際の辞書は必要ありません。 – Gabe

7

Distinctは重複するキーの問題を回避する1つのオプションです。あなたは重複のカウントが必要な場合は、次のように、あなたはもっとこのGroupByのようなものを試してみてください:

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

をアプリケーションが単純な文字列のリスト/重複カウント構造ではない場合、あなたが選ぶことから、いくつかの走行距離を得る可能性がありますのような別の構造で、ToLookup拡張機能を呼び出すことができます。または、上記のGroupByのようなグループ化機能を使用することもできます。