Lambda or LinQ expression to remove certain objects from List
我有一个购物车行列表,希望删除所有数量=0的项目
这是一个保存Cartline对象集合的列表:
1 2 3 4 5 6 7 8 9 10 11 12 | 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;} } |
比如:
1 | cart.Lines.RemoveAll(x => x.Quantity == 0) |
我只会被移除,而不是移除!
也无法在foreach循环中移除,获取错误:集合已修改;枚举操作可能无法执行。
我现在已经用这段代码做到了,一定有更有效的方法吗?
1 2 3 | var myList = cart.Lines.ToList(); myList.RemoveAll(x => x.Quantity == 0); cart.Lines = myList; |
好的问题解决了!谢谢各位,这就是:
cart.lines=cart.lines.where(x=>x.数量!=0);
如果行是
1 | cart.Lines.RemoveAll(x => x.Quantity == 0); |
但是,如果行是一个
1 | cart.Lines = cart.Lines.Where(x => x.Quantity != 0); |
更新:
由于您所说的行是一个
1 | cart.Lines = cart.Lines.Where(x => x.Quantity != 0).ToList(); |
或者您可以使用
1 2 3 | var temp = cart.Lines.ToList(); temp.RemoveAll(x => x.Quantity != 0); cart.Lines = temp; |
顺便说一句,作为一个Fyi,我定时构建一个删除列表,然后使用
下面是从100000个整数列表中删除所有偶数的时间:
- 移除所有events构建一个移除列表并对每个events调用remove()花费:3921毫秒
- 在负数上使用where()移除所有偶数,然后使用tolist()移除偶数需要:2毫秒
- 在原始文件上使用tolist()删除所有Even,然后使用removeall()删除Even需要:1毫秒
假设购物车行是列表<>:
我将继续把我的建议张贴在这个问题上。
1 |
应该是:
1 |
这将允许您使用建议的方法:
1 | cart.Lines.RemoveAll(x => x.Quantity == 0); |
你就是这样做的:
1 2 3 | var myList = cart.Lines.ToList(); myList.RemoveAll(x => x.Quantity == 0); cart.Lines = myList; |
这些查询基本上是针对一个列表的,正如您所知道的,您不应该使用它们直接修改列表。相反,您应该使用查询列出要删除的项,然后在单独的操作中删除它们。
编辑:
是的,我忘了你可以用removeall做一行:d
1 | var myResult = cart.Lines.Where(x => x.Quantity > 0) |
或者您可以使用removeall
1 | cart.Lines.RemoveAll(x => x.Quantity == 0) |
检查回答问题C的帖子,使用LINQ删除列表中的对象
您可以这样做:
1 2 3 4 | Cart cart = new Cart(); List<CartLine> cartLines = cart.Lines.ToList<CartLine>(); cartLines.RemoveAll(x => x.Quantity == 0); cart.Lines = cartLines; |
此外,还应将Cartline数量和产品属性设置为公共。