我有以下内容:
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
因为我已经拥有它们而我希望在我迭代时修改该列表。有可能吗?
答案 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