Lambda或LinQ表达式从List中删除某些对象

Las*_*eak 2 c# linq asp.net lambda

我有一个cart.Lines列表,并希望删除所有数量== 0的项目

这是一个包含CartLine对象集合的列表:

public class Cart
{
    private IList<CartLine> lines = new List<CartLine>();
    public IList<CartLine> Lines { get { return lines; } set { lines = value; } }
}   

public class CartLine
{
    Product Product {get; set;}
    int Quantity {get; set;}

}
Run Code Online (Sandbox Code Playgroud)

所以类似于:

cart.Lines.RemoveAll(x => x.Quantity == 0)
Run Code Online (Sandbox Code Playgroud)

我只得到删除和删除,而不是删除所有!

也无法在foreach循环中删除,得到错误:集合被修改; 枚举操作可能无法执行.

我现在设法用这个代码来做,肯定必须有更高效的东西?

var myList = cart.Lines.ToList();
myList.RemoveAll(x => x.Quantity == 0);
cart.Lines = myList;
Run Code Online (Sandbox Code Playgroud)

好的问题解决了!谢谢大家,这里做到了:

cart.Lines = cart.Lines.Where(x => x.Quantity!= 0);

Jam*_*are 6

如果Lines是a List<T>,那么最简单的方法就是写:

cart.Lines.RemoveAll(x => x.Quantity == 0);
Run Code Online (Sandbox Code Playgroud)

IEnumerable<T>但是,如果Lines是一个,你可以选择否定(如Vlad建议的那样) - 你也可以使用ToList()然后更改为列表,RemoveAll()但这样做会有点过分.

cart.Lines = cart.Lines.Where(x => x.Quantity != 0);
Run Code Online (Sandbox Code Playgroud)

更新:

由于你说Lines是a IList<T>,那么你需要选择否定并转换为如下列表:

cart.Lines = cart.Lines.Where(x => x.Quantity != 0).ToList();
Run Code Online (Sandbox Code Playgroud)

或者您可以转换为List<T>使用ToList()然后调用RemoveAll()然后保存回来:

var temp = cart.Lines.ToList();
temp.RemoveAll(x => x.Quantity != 0);
cart.Lines = temp;
Run Code Online (Sandbox Code Playgroud)

顺便说一句,作为一个FYI我定时建立一个删除列表,然后使用Remove()vs选择否定使用Where()和调用ToList()和Where/ToList组合更快,这是有道理的,因为它们都分配内存,但Where/ToList做了很少的内存改组.

以下是从100,000个整数列表中删除所有偶数的时间:

  • 删除构建删除列表的所有evens并在每个上面调用Remove():3921 ms
  • 使用Where()on negative然后ToList()删除所有evens:2 ms
  • 使用原始的ToList()删除所有evens然后RemoveAll()花费:1 ms