Lambda或LinQ表达式从列表中删除某些对象
本文关键字:删除 对象 列表 LinQ 表达式 Lambda | 更新日期: 2023-09-27 18:02:26
我有一辆手推车。行列出并希望删除数量==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;}
}
所以类似于:
cart.Lines.RemoveAll(x => x.Quantity == 0)
我只得到Remove和RemoveAt,而不是RemoveAll
也无法在foreach循环中删除,获取错误:集合已修改;枚举操作可能无法执行。
我现在已经用这段代码做到了,肯定还有更高效的东西吗
var myList = cart.Lines.ToList();
myList.RemoveAll(x => x.Quantity == 0);
cart.Lines = myList;
好的,问题解决了!谢谢大家,这就行了:
cart.Lines=购物车。行。其中(x=>x.数量!=0(
如果Lines是List<T>
,那么最简单的方法就是只写:
cart.Lines.RemoveAll(x => x.Quantity == 0);
不过,如果Lines是IEnumerable<T>
,你可以选择负数(正如Vlad建议的那样(——你也可以使用ToList()
更改为列表,然后使用RemoveAll()
,但这太过分了。
cart.Lines = cart.Lines.Where(x => x.Quantity != 0);
更新:
既然你说Lines是一个IList<T>
,那么你就需要选择负片并转换成一个列表,比如:
cart.Lines = cart.Lines.Where(x => x.Quantity != 0).ToList();
或者,您可以使用ToList()
转换为List<T>
,然后调用RemoveAll()
,然后保存回:
var temp = cart.Lines.ToList();
temp.RemoveAll(x => x.Quantity != 0);
cart.Lines = temp;
顺便说一句,作为仅供参考,我将构建一个移除列表然后使用Remove()
与使用Where()
选择负片并调用ToList()
进行计时,并且Where/ToList组合要快得多,这是有道理的,因为两者都分配内存,但Where/To list的内存混洗要少得多。
以下是从100000整数列表中删除所有偶数的时间:
- 删除所有even构建删除列表并对每个even调用remove((花费了3921毫秒
- 在负数上使用Where((然后使用ToList((删除所有偶数耗时:2毫秒
- 在原始文件上使用ToList((删除所有偶数,然后RemoveAll((耗时:1毫秒
假设购物车。行为列表<>:cart.Lines.RemoveAll(x => x.Quantity == 0);
这些查询本质上是对列表的foreach,正如您所知,您不应该使用它们来直接修改列表。相反,您应该使用查询列出要删除的项,然后在单独的操作中删除它们。
编辑:
是的,我忘了你可以用RemoveAll在一行中完成这件事:D
var myResult = cart.Lines.Where(x => x.Quantity > 0)
或者,您可以使用RemoveAll
cart.Lines.RemoveAll(x => x.Quantity == 0)
查看这篇文章,它回答了您的问题C#使用LINQ删除列表中的对象
我会继续发布我对这个问题的建议。
private IList<CartLine> lines = new List<CartLine>();
应该是:
private List<CartLine> lines = new List<CartLine>();
这将允许您使用建议的方法:
cart.Lines.RemoveAll(x => x.Quantity == 0);
你可以这样做:
var myList = cart.Lines.ToList();
myList.RemoveAll(x => x.Quantity == 0);
cart.Lines = myList;
您可以按如下方式执行:
Cart cart = new Cart();
List<CartLine> cartLines = cart.Lines.ToList<CartLine>();
cartLines.RemoveAll(x => x.Quantity == 0);
cart.Lines = cartLines;
此外,您应该将CartLine Quantity和Product属性设置为public。