Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于从列表中删除某些对象的Lambda或LinQ表达式_C#_Asp.net_Linq_Lambda - Fatal编程技术网

C# 用于从列表中删除某些对象的Lambda或LinQ表达式

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

我有一个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 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;