C# 用于从列表中删除某些对象的Lambda或LinQ表达式
我有一个cart.Lines列表,希望删除数量=0的所有项目 这是一个包含CartLine对象集合的列表:C# 用于从列表中删除某些对象的Lambda或LinQ表达式,c#,asp.net,linq,lambda,C#,Asp.net,Linq,Lambda,我有一个cart.Lines列表,希望删除数量=0的所有项目 这是一个包含CartLine对象集合的列表: public class Cart { private IList<CartLine> lines = new List<CartLine>(); public IList<CartLine> Lines { get { return lines; } set { lines = value; } } } public class
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;}
}
我只得到移除和移除,而不是移除所有强>
也无法在foreach循环中删除,获取错误:
收集被修改;枚举操作不能执行
我现在已经用这段代码做到了,肯定还有更有效的方法吗?
var myList = cart.Lines.ToList();
myList.RemoveAll(x => x.Quantity == 0);
cart.Lines = myList;
好的,问题解决了!谢谢大家,这里就是这样:
cart.Lines=cart.Lines.Where(x=>x.Quantity!=0)假设cart.Lines是List:
cart.Lines.RemoveAll(x=>x.Quantity==0)代码>如果行是一个列表,那么最简单的方法就是只写:
cart.Lines.RemoveAll(x => x.Quantity == 0);
但是,如果行是一个IEnumerable
,您可以选择负数(正如Vlad所建议的那样)-您也可以使用ToList()
更改为列表,然后执行RemoveAll()
,但这样做太过分了
cart.Lines = cart.Lines.Where(x => x.Quantity != 0);
更新:
因为您说过行是一个IList
,所以您需要选择负数并转换为如下列表:
cart.Lines = cart.Lines.Where(x => x.Quantity != 0).ToList();
或者您可以使用ToList()
转换到列表
,然后调用RemoveAll()
,然后保存:
var temp = cart.Lines.ToList();
temp.RemoveAll(x => x.Quantity != 0);
cart.Lines = temp;
顺便说一句,作为一个参考,我将构建一个删除列表,然后使用remove()
与使用Where()
选择负片,然后调用ToList()
和Where/ToList组合进行计时,两者都分配内存,这是有意义的,但Where/ToList执行的内存洗牌要少得多
以下是从100000整数列表中删除所有偶数的时间:
- 删除所有even生成删除列表并对每个even调用remove():3921 ms
- 使用负片上的Where()删除所有even,然后使用ToList()删除even需要2毫秒
- 在原稿上使用ToList()删除所有even,然后删除所有even()需要:1毫秒
或者,您可以使用
查看这篇回答您问题的帖子这些查询基本上都是针对列表的,您知道,您不应该使用它们直接修改列表。相反,您应该使用查询列出要删除的项,然后在单独的操作中删除它们
编辑:
是的,我忘了您可以使用RemoveAll在一行中完成此操作:D您可以按如下方式完成此操作:
Cart cart = new Cart();
List<CartLine> cartLines = cart.Lines.ToList<CartLine>();
cartLines.RemoveAll(x => x.Quantity == 0);
cart.Lines = cartLines;
Cart Cart=new Cart();
List cartLines=cart.Lines.ToList();
cartLines.RemoveAll(x=>x.Quantity==0);
cart.line=cartLines;
另外,您应该将CartLine数量和产品属性设置为public。我将继续并发布我对这个问题的建议
private IList<CartLine> lines = new List<CartLine>();
通过这样做,您可以做到这一点:
var myList = cart.Lines.ToList();
myList.RemoveAll(x => x.Quantity == 0);
cart.Lines = myList;
因此,请使用cart.Lines=cart.Lines.Where(x=>x.Quantity>0.ToList()
@LaserBeak-您究竟为什么要使用接口集合而不是通用列表集合?@Ramhound,他可能正试图将实现与接口分离一点。许多代码分析工具倾向于建议使用IList或ICollection,而不是直接使用List。不是说那一定是好的还是坏的,只是一些经常发生的事情。是的,他在编辑中添加了IList澄清。看起来ToList()/RemoveAll()组合可能是最有效的。。。(见下面的计时),但几乎没有。负数条件下的Where()后跟ToList()的速度几乎一样快。我认为RemoveAll()对于List非常优化,因此它的速度非常快,而其他使用迭代器(yield-return)的Linq方法的速度往往较慢。
Cart cart = new Cart();
List<CartLine> cartLines = cart.Lines.ToList<CartLine>();
cartLines.RemoveAll(x => x.Quantity == 0);
cart.Lines = cartLines;
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;