首页 > 解决方案 > 如何从 C# 中的 lambda 表达式中删除列表项?

问题描述

如果我有这个

private static List<Action> actions = new List<Action>();

private static void Main()
{
    for (var i = 0; i < 10; i += 1)
    {
        Action action = async () => {
            // want to remove this specific lambda item from the "actions" variable. 
            // is there something like this:
            /*
                Action this_action = this;
                actions.Remove(this_action);
            */
        };

        actions.Add(action);
    }

    Parallel.Invoke(actions.ToArray());

    Console.Write("\nPress any key to exit...");
    Console.ReadKey();
}

如何正确地将其从列表中删除。我需要某种自我参考吗?

注意:
刚刚运行的操作应该是要删除的操作。这些动作的完成顺序可能与它们添加到列表的顺序不同,但运行的动作应该是删除的动作。而且我不想同时删除它们,只有当它们完成时。

谢谢

标签: c#

解决方案


您可以只使用引用action来删除操作的实例。闭包将确保引用指向正确的对象。

for (var i = 0; i < 10; i += 1)
{
    Action action = null;
    action = () => {
        actions.Remove(action);
    };

    actions.Add(action);
}

Parallel.Invoke(actions.ToArray());

有关工作示例,请参阅Fiddle 。


推荐阅读