【发布时间】:2021-08-19 21:30:28
【问题描述】:
我一直在想,它一直困扰着我,用什么方式编写使用 LINQ 的 foreach 语句更有效。
据我所知,ToList() 在内存中创建对象,而 IEnumerable 进行引用,并且仅在需要数据时过滤数据以供使用。
问题是,foreach 语句是在每次迭代时调用 List/IEnumerable,还是只调用一次并将该对象/List 保存在内存中?
查看以下内容,哪个选项最有效以及出于什么原因?
-
选项 A
foreach (Car car in CarList.Where(x => x.Make == "BMW")) {} -
选项 B
foreach (Car car in CarList.Where(x => x.Make == "BMW").ToList()) {} -
选项 C
IEnumerable<Car> myCarList = CarList.Where(x => x.Make == "BMW"); foreach (Car car in myCarList) {} -
选项 D
IEnumerable<Car> myCarList = CarList.Where(x => x.Make == "BMW").ToList(); foreach (Car car in myCarList) {}
【问题讨论】:
-
我的猜测是 A 和 C 是最快的,但这真的取决于
CarList是什么。与任何与性能相关的事情一样,唯一的判断方法就是自己测试。 -
你再也不用问这种类型的问题github.com/dotnet/BenchmarkDotNet
-
@faso 不,永远不要使用秒表进行基准测试,它非常不可靠。使用合适的工具,例如 BenchmarkDotNet
-
@DavidG 说了什么
-
a 和 c 基本相同,b 和 d 也一样。一般来说 a 和 c 会更快,因为它们不会产生创建和调整列表大小的成本(快多少很大程度上取决于列表的大小)。选项 e(完全不使用 LINQ 的标准 foreach 中的检查)几乎总是比所有选项都快。
标签: c#