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

时间:2011-07-15 14:04:15

标签: c# asp.net linq lambda

我有一个cart.Lines List并希望删除所有数量== 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)

我只获取删除和删除,而不是删除所有!

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

我现在已经设法使用此代码执行此操作,当然必须有更高效的内容吗?

var myList = cart.Lines.ToList();
myList.RemoveAll(x => x.Quantity == 0);
cart.Lines = myList;

好的问题解决了!谢谢大家,这就是这样做的:

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

6 个答案:

答案 0 :(得分:6)

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

cart.Lines.RemoveAll(x => x.Quantity == 0);

如果行是IEnumerable<T>,您可以选择否定(如Vlad建议的那样) - 您也可以使用ToList()更改为列表然后执行RemoveAll()但是太过分了。

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

<强>更新

由于您说行是IList<T>,因此您需要选择否定并转换为以下列表:

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

或者您可以使用List<T>转换为ToList(),然后拨打RemoveAll()然后再保存:

var temp = cart.Lines.ToList();
temp.RemoveAll(x => x.Quantity != 0);
cart.Lines = temp;

顺便说一句,作为一个仅供参考,我计划建立一个删除列表然后使用Remove() vs使用Where()选择否定并调用ToList()并且Where / ToList组合更快有意义,因为它们都分配内存,但Where / ToList减少了内存改组。

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

  • 删除构建删除列表的所有evens并在每个上面调用Remove():3921 ms
  • 使用Where()on negative然后ToList()删除所有evens:2 ms
  • 在原始文件上使用ToList()删除所有的平均值,然后删除所有():1毫秒

答案 1 :(得分:3)

假设cart.Lines是List&lt;&gt;:cart.Lines.RemoveAll(x => x.Quantity == 0);

答案 2 :(得分:1)

var myResult = cart.Lines.Where(x => x.Quantity > 0)

或者您可以使用RemoveAll

cart.Lines.RemoveAll(x => x.Quantity == 0)

查看此帖子,以回答您的问题C# using LINQ to remove objects within a List

答案 3 :(得分:1)

这些查询基本上是在列表上进行的,如您所知,您不应该使用它们来直接修改列表。相反,您应该使用查询列出要删除的项目,然后在单独的操作中删除它们。

编辑:

是的,我忘记你可以使用RemoveAll在一行中执行此操作:D

答案 4 :(得分:1)

我会继续发表我的建议来解决这个问题。

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;   

答案 5 :(得分:0)

您可以按照以下方式执行此操作:

Cart cart = new Cart();
List<CartLine> cartLines = cart.Lines.ToList<CartLine>();
cartLines.RemoveAll(x => x.Quantity == 0);
cart.Lines = cartLines;

此外,您应将CartLine数量和产品属性设置为公共。