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

标签 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 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/

相关文章:

asp.net 核心身份声明与属性(效率观点)

asp.net - PayPal Express Checkout 返回 - 安全 header 无效

c# - Entity Framework 与直接数据访问

c# - 使用 LINQ 或 C# 清理字符串中特定 HTML 的算法

c# - 排除包含另一个列表中的值的列表项

c# - 我想要一个 String 字段由另外两个字段组成

C#中提取文本文件需要信息并输出with语句

c# - ASP.NET Web 应用程序的推荐体系结构是什么?

c# - MdilXapCompile.exe 失败,错误代码为 2001

linq - MongoDb c# driver LINQ vs Native 查询