我有一个 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;}
}
所以像这样:
cart.Lines.RemoveAll(x => x.Quantity == 0)
我只得到 Remove 和 RemoveAt,没有 RemoveAll !
也无法在 foreach 循环中删除,得到错误: 集合被修改;枚举操作可能不会执行。
我现在已经设法用这段代码做到了,肯定有更高效的方法吗?
var myList = cart.Lines.ToList();
myList.RemoveAll(x => x.Quantity == 0);
cart.Lines = myList;
好的,问题解决了!谢谢大家,这里就可以了:
cart.Lines = cart.Lines.Where(x => x.Quantity != 0);
最佳答案
如果 Lines 是 List<T>
,那么最简单的方法就是写:
cart.Lines.RemoveAll(x => x.Quantity == 0);
如果 Lines 是 IEnumerable<T>
, 不过,您可以选择否定(如 Vlad 建议的那样)- 您也可以使用 ToList()
更改为列表然后做 RemoveAll()
但这太过分了。
cart.Lines = cart.Lines.Where(x => x.Quantity != 0);
更新:
既然你说 Lines 是一个 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()
与使用 Where()
选择负片相比并调用 ToList()
Where/ToList 组合要快得多,这是有道理的,因为两者都分配内存,但 Where/ToList 进行的内存改组要少得多。
这是从 100,000 整数列表中删除所有偶数的时间:
- 删除所有构建删除列表并在每个事件上调用 Remove() 的事件耗时:3921 毫秒
- 在负数上使用 Where() 删除所有偶数,然后使用 ToList() 耗时:2 毫秒
- 在原始 RemoveAll() 上使用 ToList() 删除所有偶数花费:1 毫秒
关于c# - 用于从列表中删除某些对象的 Lambda 或 LinQ 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6708178/