如何在List.ForEach()中使用条件?

4th*_*ace 0 .net c# linq linq-to-objects list

我需要从HttpSession集合中删除项目.在以下代码中,myList包含与Session相同的项目.如果myList/Session中的项目不在itemsToRemove中,则应从会话集合中删除它们.

但是,我不确定lambda语法应该是什么样子.以下是不正确的.

myList.ForEach(x => !itemsToRemove.Contains(x) { Session.Remove(x) });
Run Code Online (Sandbox Code Playgroud)

任何想法如何使用lambda表达式将所有内容放在一行来完成此任务?

另外,有没有办法避免创建中间列表(myList)?我只是这样做,因为我在迭代它时不能从Session中删除项目.

aba*_*hev 7

最天真的方式:

myList.Where(x => !itemsToRemove.Contains(x)) // LINQ extension method
      .ToList()                                                                 <----
      .ForEach(x => Session.Remove(x));       // List<T> method so this is required |
Run Code Online (Sandbox Code Playgroud)

你也可以使用这个:

mystList.Except(itemsToRemove)
        .ToList()
        .ForEach(x => Session.Remove(x));
Run Code Online (Sandbox Code Playgroud)

但要使用ForEach底层类型应该是List<T>首先需要调用ToList().是什么导致整个集合的过度枚举.

我会这样做:

foreach (var x in mystList.Except(itemsToRemove))
{
    Session.Remove(x)
}
Run Code Online (Sandbox Code Playgroud)

这将最大限度地减少枚举数量.