1

このような問題のパターン (ベスト プラクティス) は何ですか? コレクション内の要素 (値) を変更しますか?

条件:

  • コレクションのサイズは変更されません (要素は削除または追加されません)
  • 変更はインプレースです

C++ では、コレクションを反復処理して要素を変更するだけで、簡単でよかったです。しかし、C# では (列挙子を使用した) 反復処理は読み取り専用操作です (C++ に関して言えば、const_iterator のみが使用可能です)。

では、C# でこれを行うにはどうすればよいでしょうか。

例: "1,2,3,4" のシーケンスを変更すると、"1, 2, 8, 9" に変更されますが、"1, 2, 3" または "1, 2, 3, 4, 5" には変更されません。

4

2 に答える 2

5

通常、代わりにインデックスで移動します。

for (int i = 0; i < foo.Length; i++)
{
    if (ShouldChange(foo[i]))
    {
        foo[i] = GetNewValue(i);
    }
}

より機能的な代替手段は、目的の「変更された」データを含む新しいコレクションを返すメソッドを作成することです。ただし、それはすべて、何をしたいかによって異なります。

于 2010-03-12T12:06:20.813 に答える
1

実際、それは依存します。読み取り専用部分はイテレータ自体に適用されます。オブジェクトのコレクションを繰り返し処理している場合、参照を介してオブジェクトの状態を変更できます。

値型のコレクションの場合、反復中に要素を変更することはできませんが、その場合、通常のループとインデクサーを使用して要素を実行できます。

于 2010-03-12T12:07:38.620 に答える