web-dev-qa-db-ja.com

C#辞書<string、bool>のすべての値を設定するための最良の方法は何ですか?

C#辞書のすべての値を設定するための最良の方法は何ですか?

これが私が今やっていることですが、これを行うためのより良い/よりきれいな方法があると確信しています:

Dictionary<string,bool> dict = GetDictionary();
var keys = dict.Keys.ToList();
for (int i = 0; i < keys.Count; i++)
{
    dict[keys[i]] = false;
}

Foreachで他の方法をいくつか試しましたが、エラーが発生しました。

29
Ronnie Overby

それは合理的なアプローチですが、私は次のことを好みます。

_foreach (var key in dict.Keys.ToList())
{
    dict[key] = false;
}
_

ToList()を呼び出すと、キーのリストが取り出されて(一時的に)保存されるため、この作業が機能し、反復が機能します。

70
Reed Copsey

1行のソリューション:

dict = dict.ToDictionary(p => p.Key, p => false);
24
jeatsy

トライステートブールを使用していない場合は、_HashSet<string>_を使用し、Clear()を呼び出して値を「false」に設定できます。

6
Sam Harwell

それが最善の方法かどうかはわかりませんが、1行で何かを探していたので、これでうまくいきました

mydict.Keys.ToList().ForEach(k => mydict[k] = false);
4
Daniele D.

ビリーとリードのソリューションの違いをプロファイリングしました。 Polaris878、結果に注意し、時期尚早の最適化がすべての悪の根源であることを忘れないでください;-)

私はVB(現在その言語でプログラミングしているため)でソリューションを書き直し、intキー(簡単にするため)を使用しました。それ以外はまったく同じコードです。次の辞書を使用してコードを実行しました。各エントリの値が「true」の1,000万エントリ。

ビリーウィッチドクターの元の解決策:

Dim keys = dict.Keys.ToList
For i = 0 To keys.Count - 1
    dict(keys(i)) = False
Next

経過ミリ秒:415

リードコプシーのソリューション:

For Each key In dict.Keys.ToList
    dict(key) = False
Next

経過ミリ秒:395

その場合、foreachは実際にはfasterです。

1
Meta-Knight