14

私は次のものを持っています:

foreach (var depthCard in depthCards)
{
    var card = InternalGetCard(db, depthCard.CardId);
    var set = InternalGetSet(db, (int)card.ParentSetId);
    var depthArray = InternalGetDepthArrayForCard(db, set.SetId);
    foreach (var cardToUpdate in set.Cards)
    {
        // do stuff
        SaveChanges(db);
        // since I already took care of it here, remove from depthCards
        depthCards.Remove(depthCardToUpdate);
    }
}

ループの途中でコレクションを変更しているため、これは機能しません。このタイプのアクセスを許可するコレクションのタイプはありますか?

私はそれらをすでに持っていて、繰り返しながらそのリストを変更したいToList()ので、したくありません。これは可能ですか?depthCards

4

3 に答える 3

29

それは可能です、トリックは後方に反復することです:

for (int i = depthCards.Count - 1; i >= 0; i--) {
  if (depthCards[i] == something) { // condition to remove element, if applicable
     depthCards.RemoveAt(i);
  }
}
于 2013-07-20T22:11:23.210 に答える
7

for-loopで逆方向に繰り返すことができます

for (int i = depthCards.Count - 1; i >= 0; i--)
{
    depthCards.RemoveAt(i);
}

または、条件に基づいてアイテムを削除するだけの場合は、次を使用しますList.RemoveAll

depthCardToUpdate.RemoveAll(dc => conditionHere);
于 2013-07-20T22:12:36.040 に答える
1

これを処理するカスタム列挙子を作成できます。私はこれを一度やりましたが、少しトリッキーでしたが、いくつかのフィネスの後に機能しました.

参照: http://www.codeproject.com/Articles/28963/Custom-Enumerators

于 2013-07-20T22:08:43.937 に答える