我正尝试找到一种优雅的方法来在列表上进行迭代,同时删除项目。
我知道这个解决方案。但我的条件更为苛刻:
- 此处全部是单线程
- 迭代必须向前进行。
- 每个项目必须仅处理一次
- 多个和随机的项目可以在处理1个项目时被删除。
- 项目是复杂和智能对象。它们执行一个自定义方法,并且该方法可以决定是否应该删除某些项目(从0到全部)。
- (添加和插入也可能发生,但目前不重要,如果有办法同时处理这个问题,那就太好了)
问题:这可能吗?如果是,如何实现?
我有一个想法,可以将对象标记为“已删除”/“非活动”。当我稍后再次迭代时,我将删除它们而不调用它们执行任何操作。迭代会经常重复,这就是为什么每个对象必须在每次迭代中恰好有1个轮换的原因。这样行得通吗?
这是我现在处理事情的方式。它并不完美,但希望能给你提供提示,了解需要的内容。
伪代码:
class Foo
{
public void DoStuff()
{
// do other stuff
if (condition)
Kill(x); // should result in list.RemoveAt(x) somehow
}
}
class Program
{
[STAThread]
static void Main(string[] args)
{
List<Foo> list = new List<Foo>();
for (int i = 0; i < 15; i++)
list.Add(new Foo());
for (int i = 0; i < list.Count; i++)
list[i].DoStuff();
Console.ReadKey();
}
}
感谢任何帮助!
(这不是一个XY问题。我确定。这个问题已经困扰我多年了,现在我决定找到一个可靠的解决方案。我在C#中工作。这不是一个恶作剧。如果看起来像是,我很抱歉。)
foreach
循环体中的代码正在从正在迭代的集合中删除项目。只涉及一个线程,但从迭代器的角度来看,它正在尝试在迭代集合时从“其他地方”进行变异。这很容易创建:foreach(var item in list) list.RemoveAt(random.Next(list.Count));
- Servy