代码Im维护具有如下所示的共同模式,具有if以查找某些元素的嵌套循环.
foreach (Storage storage in mStorage.Values)
foreach (OrderStorage oStorage in storage.OrderStorage)
if (oStorage.OrderStorageId == orderStorageId)
Run Code Online (Sandbox Code Playgroud)
我想把它改成LINQ:
foreach (OrderStorage oStorage in (from storage in mStorage.Values
from oStorage in storage.OrderStorage
where oStorage.OrderStorageId == orderStorageId
select oStorage))
Run Code Online (Sandbox Code Playgroud)
但它看起来并不吸引人,因为它在这里发生的透明度较低,可能会产生更多的对象,从而在内存和CPU方面都会降低成本.实际上是否会创建更多的对象,或者C#编译器是否会发出类似于嵌套循环的代码并且内部有if?
Mar*_*ell 14
实际上是否会创建更多的对象,或者C#编译器是否会发出类似于嵌套循环的代码并且内部有if?
更多对象; 每个LINQ操作(SelectMany
,Where
,Select
等等)将导致一个表示待定一个新的占位符对象IEnumerable<T>
该操作的查询,然后当它最终迭代中,每个这些将导致一个枚举实例,与上下文等一起此外,还有一个捕获变量的背景,用于悬挂orderStorageId
等.
请注意,常规foreach
也会产生一个枚举器实例,但foreach
它的优点是它也可以使用duck-typed枚举器 - 这意味着List<T>
它实际上使用的是struct
枚举器,而不是class
枚举器.当然,orderStorageId
直接使用局部变量()(而不是匿名方法)意味着它不需要被提升到状态/上下文对象中.
所以,是的,原始foreach
更直接,更有效.有趣的问题是:差异是否重要.有时它是,有时它不是.
归档时间: |
|
查看次数: |
715 次 |
最近记录: |