@smaclell は、@sambo99 へのコメントで、逆反復がより効率的である理由を尋ねました。
より効率的な場合もあります。人のリストがあり、信用格付けが 1000 未満のすべての顧客を削除またはフィルター処理したいとします。
次のデータがあります
"Bob" 999
"Mary" 999
"Ted" 1000
前方に反復すると、すぐに問題が発生します
for( int idx = 0; idx < list.Count ; idx++ )
{
if( list[idx].Rating < 1000 )
{
list.RemoveAt(idx); // whoops!
}
}
idx = 0 で を削除するBobと、残りのすべての要素が左にシフトされます。次回ループ idx = 1 を通過しますが、list[1]TedはMary. Mary誤ってスキップしてしまいます。while ループを使用して、さらに変数を導入することができます。
または、逆に繰り返します。
for (int idx = list.Count-1; idx >= 0; idx--)
{
if (list[idx].Rating < 1000)
{
list.RemoveAt(idx);
}
}
削除されたアイテムの左側にあるすべてのインデックスは同じままなので、アイテムをスキップしません。
配列から削除するインデックスのリストが与えられた場合も、同じ原則が適用されます。物事をまっすぐに保つために、リストを並べ替えてから、アイテムを最高のインデックスから最低のインデックスに削除する必要があります。
これで、Linq を使用して、実行していることを簡単に宣言できます。
list.RemoveAll(o => o.Rating < 1000);
単一のアイテムを削除するこのケースでは、前方または後方に反復することは効率的ではありません。これにはLinqを使用することもできます。
int removeIndex = list.FindIndex(o => o.Name == "Ted");
if( removeIndex != -1 )
{
list.RemoveAt(removeIndex);
}