2

辞書を検索して、特定の値があるかどうかを確認し、そうであれば変更しようとしています。これが私のコードです:

foreach (var d in dictionary)
{
    if (d.Value == "red")
    {
         d.Value = "blue";
    }
}

Visual Studio でコードのデバッグをステップ実行すると、値が変更されていることがわかります。その後、foreach ループにヒットして再度繰り返すと、例外がスローされます。

「コレクションが変更されました。列挙操作が実行されない可能性があります」

これを修正するにはどうすればよいですか?

4

6 に答える 6

5

foreach の途中で変更することはできません。次のような他のメカニズムを考え出す必要があります。

// Get the KeyValuePair items to change in a separate collection (list)
var pairsToChange = dictionary.Where(d => d.Value == "red").ToList();
foreach(var kvp in pairsToChange)
    dictionary[kvp.Key] = "blue";
于 2013-03-20T15:33:31.417 に答える
1
var dict = new Dictionary<string, string>()
          {
                  { "first", "green" },
                  { "second", "red" },
                  { "third", "blue" }
          };

foreach (var key in dict.Keys.ToArray())
{
    if (dict[key] == "red")
    {
        dict[key] = "blue";
    }
}
于 2013-03-20T15:39:01.703 に答える
0

foreachループで繰り返し処理しているコレクションを変更することはできません。それができれば、「この新たに付加価値のあるものでも実行できるのか」など、いくつかの問題が発生します。

代わりに、次のようなことを行う必要があります。

foreach( string key in dictionary.Keys )
{
    if( dictionary[key] == "red" )
    {
        dictionary[key] = "blue";
    }
}
于 2013-03-20T15:35:11.273 に答える
0

foreachループ内のオブジェクトは読み取り専用です。

詳細については、これこれをお読みください。

于 2013-03-20T15:36:23.930 に答える
0

「赤」の出現をすべて置き換えたい場合は、KeyValuePairs をリストなどに保存する必要があります。

var redEntries = dictionary.Where(e => e.Value == "red").ToList();
foreach (var entry in redEntries) {
    dictionary[entry.Key] = "blue";
}
于 2013-03-20T15:32:46.980 に答える
0

コレクションを (ループで) 列挙している間は、コレクションを変更することはできません。

変更をコレクションに追加してから、個別に変更する必要があります。何かのようなもの:

var itemsToChange = dictionary
    .Where(d => d.Value == "red")
    .ToDictionary(d => d.Key, d => d.Value);

foreach (var item in itemsToChange)
{
    dictionary[item.Key] = "blue";
}
于 2013-03-20T15:35:05.470 に答える