关于c#:Lambda或LinQ表达式,用于从List中删除某些对象

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);


如果行是List,那么最简单的方法是只写:

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

但是,如果行是一个IEnumerable,您可以选择负值(如vlad建议的那样),您也可以使用ToList()更改为一个列表,然后执行RemoveAll(),但这将是多余的。

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

更新:

由于您所说的行是一个IList,那么您将希望选择负数并转换为如下列表:

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

或者您可以使用ToList()转换到List,然后调用RemoveAll(),然后保存:

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

顺便说一句,作为一个Fyi,我定时构建一个删除列表,然后使用Remove()与使用Where()选择负数和调用ToList()相比,使用where/tolist组合更快,这是有意义的,因为两者都分配了内存,但是where/tolist的内存混乱要少得多。

下面是从100000个整数列表中删除所有偶数的时间:

  • 移除所有events构建一个移除列表并对每个events调用remove()花费:3921毫秒
  • 在负数上使用where()移除所有偶数,然后使用tolist()移除偶数需要:2毫秒
  • 在原始文件上使用tolist()删除所有Even,然后使用removeall()删除Even需要:1毫秒

假设购物车行是列表<>:cart.Lines.RemoveAll(x => x.Quantity == 0);


我将继续把我的建议张贴在这个问题上。

1
private IList<CartLine> lines = new List<CartLine>();

应该是:

1
private List<CartLine> lines = new List<CartLine>();

这将允许您使用建议的方法:

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数量和产品属性设置为公共。