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

You can create a custom enumerator that handles this for you. I did this once and it was a bit tricky but worked after some finesse.

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

于 2013-07-20T22:08:43.937 回答