可以在迭代时修改List吗?

Rob*_*ous 11 .net c#

我有以下内容:

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);
        depthCards.Remove(depthCardToUpdate); // since I already took care of it here, remove from depthCards
    }
}
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为我正在循环中修改集合.我的问题是......是否有某种类型的集合允许这种类型的访问?

我不想ToList()depthCards,因为我已经有他们,我修改该列表作为我迭代.可能吗?

Ósc*_*pez 23

这是可能的,诀窍是向后迭代:

for (int i = depthCards.Count - 1; i >= 0; i--) {
  if (depthCards[i] == something) { // condition to remove element, if applicable
     depthCards.RemoveAt(i);
  }
}
Run Code Online (Sandbox Code Playgroud)


Tim*_*ter 7

您可以使用for-loop 向后迭代

for (int i = depthCards.Count - 1; i >= 0; i--)
{
    depthCards.RemoveAt(i);
}
Run Code Online (Sandbox Code Playgroud)

您还可以使用List.ForEach允许在迭代时修改列表:

depthCardToUpdate.ForEach(dc => depthCardToUpdate.Remove(dc));   
Run Code Online (Sandbox Code Playgroud)

或者如果您只想删除条件中的项目,请使用List.RemoveAll:

depthCardToUpdate.RemoveAll(dc => conditionHere);
Run Code Online (Sandbox Code Playgroud)