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(

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

如果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。