c# 抜ける foreach ループ内のリストの変更



foreach c# (3)

私はこれに似た構造を持っています(しかしもっと複雑です):

var list = new List<string>();

// .. populate list ..

foreach(var item in list)
{
    DoFunction(list);
}

public void DoFunction(List<string> list)
{
    if(someCondition == true)
    {
        // .. modify list in here ..
    }
}

さて、私は理解しているコレクションを編集できないことを理解していますが、リストを編集する必要がある場合( try catchステートメントを使用しない場合)、どのようにループから抜け出すのですか? リストが編集されているかどうかを確認する方法はありますか? あなたはリストを編集してすぐにbreak; それが気づく前に?


Answer #1

foreach構文を使用するのではなく、 forループを使用するとリストを変更できます。

for (var x = 0; x < list.Count; x++) {

}

Answer #2

はい、それはあなたが本当に欲しいものなら、壊れてしまうかもしれません。 forループがリストから次の項目を取得しようとするまで、例外はスローされません。

しかし、リストのコピー全体を作成して反復するのが最も簡単だから、気にする必要はありません。

foreach(var item in list.ToList())

余分な、手を加えられないリストの追加されたパフォーマンスオーバーヘッドは、より複雑なコードの保守容易性コストと比較して、一般に無視できる。


Answer #3

どんな種類の編集が行われているのかわからなくても、役に立つアドバイスを提供するのは難しいです。 しかし、私が見つけたパターンは、新しいリストを作成するのに最も汎用的な価値があります。

たとえば、各アイテムを見て、それを削除するか、そのまま残すか、またはアイテムの後ろに挿入するかを決める必要がある場合は、次のようなパターンを使用できます。

IEnumerable<string> butcherTheList(IEnumerable<string> input)
{
    foreach (string current in input)
    {
        if(case1(current))  
        {
            yield return current;
        }
        else if(case2(current))
        {
            yield return current;
            yield return someFunc(current);
        }
        // default behavior is to yield nothing, effectively removing the item
    }
}

List<string> newList = butcherTheList(input).ToList();




foreach