可以在迭代时修改List吗?

时间:2013-07-20 22:07:38

标签: c# .net

我有以下内容:

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
    }
}

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

我不想ToList() depthCards因为我已经拥有它们而我希望在我迭代时修改该列表。有可能吗?

3 个答案:

答案 0 :(得分:23)

有可能,诀窍是向后迭代:

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

答案 1 :(得分:7)

您可以使用for - 循环

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

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

depthCardToUpdate.ForEach(dc => depthCardToUpdate.Remove(dc));   

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

depthCardToUpdate.RemoveAll(dc => conditionHere);

答案 2 :(得分:1)

您可以创建一个自定义枚举器来为您处理此问题。我这样做了一次,它有点棘手,但经过一些技巧后才能工作。

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