我有一个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);
答案 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个整数列表中删除所有偶数的时间:
答案 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数量和产品属性设置为公共。