2011-07-15 89 views
2

删除某些对象我有一个cart.Lines列表和要删除所有项目,其中数量== 0LAMBDA或LINQ表达式从列表

这是存放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) 

我只得到删除和RemoveAt移除,不removeall过!

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

我现在设法做到这一点,肯定会有更有效的东西? !

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

好的问题解决了谢谢你们,这在这里做的:(!X => x.Quantity = 0)

cart.Lines = cart.Lines.Where;

+0

它看起来像一个ToList()/ RemoveAll()组合甚至可能是最高效......(见下面的时间表),但是很棒。 ToList()后面的Negative条件的Where()几乎一样快。我认为RemoveAll()对列表进行了非常优化,所以在使用迭代器的其他Linq方法(yield return)方面速度非常快,而这些方法往往会慢一些。 –

回答

5

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

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

如果行是IEnumerable<T>,不过,你可以选择负数(如Vlad建议的) - 你也可以使用ToList()更改为列表,然后执行RemoveAll(),但这样做会过度。

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

UPDATE:

既然你说行是IList<T>,那么你将要选择的消极和转换到一个列表,如:

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

或者你也可以CONVER到List<T>使用ToList()然后致电RemoveAll(),然后储回:

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

此外,作为一个供参考我计时都建立一个列表中移除,然后使用Remove() VS使用Where()选择消极和调用ToList()和Where/ToList组合快得多这是有意义的,因为这两个分配内存,但在哪里/ ToList可以减少很多内存洗牌。

下面是去除所有的偶数号码的开出10万个整数列表的时机:

  • 删除所有找齐建立一个列表中移除,并在每个调用remove()了:3921毫秒
  • 删除所有找齐使用Where()负,然后ToList()了:2毫秒
  • 使用上原有然后removeall过ToList()删除所有埃文斯()参加:1毫秒
3

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

+0

这是一个IList .. – LaserBeak

+0

IList,或IList ? –

+0

所以使用'cart.Lines = cart.Lines.Where(x => x.Quantity> 0).ToList()' – treetey

1

这些查询主要的foreach在列表中,你也知道,你不应该使用它们直接修改列表。相反,您应该使用该查询制作要删除的项目列表,然后在单独的操作中将其删除。

编辑:

叶,我忘了你可以使用的removeAll为此在一个行:d

0

可以按如下方式做到这一点:

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

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

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;