2

Dictionary(Key, Value) をループしたい場合...ループに新しいキーと値のペアを追加できないのはなぜですか?

Dictionary<string, string> persons = new Dictionary<string, string>();

persons.Add("roger", "12");
persons.Add("mary", "13");

foreach (KeyValuePair<string,string> person in persons)
{
 Console.WriteLine("Name: " + person.Key + ", Age: " + person.Value);
 persons.Add("Xico", "22");
}
4

8 に答える 8

21

これは、列挙子の構築方法が原因です。

MSDN Dictionary.Enumeratorから:

コレクションが変更されない限り、列挙子は有効なままです。要素の追加、変更、または削除などの変更がコレクションに加えられた場合、列挙子は回復できないほど無効になり、その動作は未定義になります。

ただし、これを回避するのは簡単です。Dictionary (またはそのキー) のコピーを作成し、追加/削除などを繰り返すだけです。必要に応じて元の辞書から。

于 2009-01-07T17:13:23.147 に答える
8

単純に、列挙時に辞書を変更することはできません。そうでなければ、いつ完了したことを知りますか?

于 2009-01-07T17:10:24.620 に答える
7

これを行うには、Dictionary オブジェクトのコピーを取得し (さまざまな方法で実行できます)、それを列挙し、元のオブジェクトに必要なものを追加する必要があります。

Dictionary の列挙中に新しい項目を追加することはできません。

于 2009-01-07T17:12:02.073 に答える
1

コレクションを列挙する場合 (つまり、foreach ループ)、コレクションに項目を追加または削除することはできません。もしそれが許されたら、どんな問題が生じるか考えてみてください。

于 2009-01-07T17:13:55.250 に答える
0

スクロールしている辞書の項目が変更されるため...意味がありません...(そして、永遠にループする可能性があります)

于 2009-01-07T17:12:28.110 に答える
0

ループの反復中にコレクション内のエントリ数を変更しようとしています。for ループはこれを実行できますが、foreach イテレータでは実行できません。

于 2009-01-07T17:14:40.443 に答える
0
Dictionary<string, string> persons = new Dictionary<string, string>();
persons.Add("roger", "12");
persons.Add("mary", "13");
for (int i = 0; i < persons.Count; i++){ 
Console.WriteLine("Name: " + persons[i].Key + ", Age: " + persons[i].Value); 
persons.Add("Xico", "22");
}

最後のエントリに到達する前に常に人を追加しているため、これは無限ループであることに注意してください。

于 2009-01-07T17:17:34.183 に答える
0

それはただ...奇妙です。既に辞書に登録されている各人物に対して、同じ人物を再度追加しようとしています。

また、年齢を文字列として保存するのはなぜですか? int (または DateTime でさえ) の方がはるかに適切なようです。

于 2009-01-07T17:10:04.480 に答える