[解決済み】foreachループで辞書の値を編集する
2022-04-06 20:18:47
質問
辞書から円グラフを作成しようとしています。円グラフを表示する前に、データを整頓したいのです。円グラフの5%に満たない円グラフを削除して、「その他」の円グラフに入れました。しかし
Collection was modified; enumeration operation may not execute
例外が発生します。
辞書の反復処理中に項目の追加や削除ができない理由は理解しています。しかし、foreachループの中で既存のキーの値を単純に変更できない理由は理解できません。
私のコードの修正について、何かご提案がありましたら、お願いします。
Dictionary<string, int> colStates = new Dictionary<string,int>();
// ...
// Some code to populate colStates dictionary
// ...
int OtherCount = 0;
foreach(string key in colStates.Keys)
{
double Percent = colStates[key] / TotalCount;
if (Percent < 0.05)
{
OtherCount += colStates[key];
colStates[key] = 0;
}
}
colStates.Add("Other", OtherCount);
解決方法は?
辞書に値を設定すると、内部の "バージョン番号" が更新され、イテレータと、キーまたは値のコレクションに関連付けられたすべてのイテレータが無効になります。
しかし同時に、値のコレクションが反復の途中で変更されるとしたら、それは奇妙なことです。
この種の問題を解決する通常の方法は、キーのコレクションをあらかじめコピーしておき、そのコピーに対して反復処理を行うか、元のコレクションに対して反復処理を行うが、反復処理が終わった後に適用する変更点のコレクションを維持することです。
例えば
キーを先にコピーする
List<string> keys = new List<string>(colStates.Keys);
foreach(string key in keys)
{
double percent = colStates[key] / TotalCount;
if (percent < 0.05)
{
OtherCount += colStates[key];
colStates[key] = 0;
}
}
または...
モディファイリストの作成
List<string> keysToNuke = new List<string>();
foreach(string key in colStates.Keys)
{
double percent = colStates[key] / TotalCount;
if (percent < 0.05)
{
OtherCount += colStates[key];
keysToNuke.Add(key);
}
}
foreach (string key in keysToNuke)
{
colStates[key] = 0;
}
関連
-
[解決済み】ORA-01008: すべての変数がバインドされていません。これらはバインドされています。
-
[解決済み】Linq 構文 - 複数列の選択
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?
-
[解決済み] C#がforeachで変数を再利用するのは理由があるのか?
-
[解決済み] C#でHashtableよりDictionaryが好まれる理由とは?
-
[解決済み] foreachループの現在の反復処理のインデックスを取得するにはどうすればよいですか?
-
[解決済み] 辞書を値で並べ替えるにはどうしたらいいですか?
-
[解決済み] C# の辞書を値で初期化する適切な方法
-
[解決済み] .NETでは、'for'と'foreach'のどちらのループが速く実行されますか?
-
[解決済み】`foreach`ループの反復をスキップするにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み】ASP.NET Core Dependency Injectionのエラーです。アクティブ化しようとしているときに、タイプのサービスを解決できません。
-
[解決済み】SmtpException: トランスポート接続からデータを読み取れません:net_io_connectionclosed
-
[解決済み】ORA-01008: すべての変数がバインドされていません。これらはバインドされています。
-
[解決済み] 'IEnumerable<SelectListItem>' 型の ViewData アイテムで、キーが国であるものは存在しない。
-
[解決済み】Socket.Selectがエラー "An operation was attempted on something that is not a socket" を返す。
-
[解決済み】WSACancelBlockingCallの例外について
-
[解決済み】2つ(またはそれ以上)のリストを1つに統合する(C# .NETで
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない
-
[解決済み】Nullableオブジェクトは値を持たなければならない?