LINQ vs嵌套循环

Ser*_*sen 4 .net c# linq

代码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更直接,更有效.有趣的问题是:差异是否重要.有时它是,有时它不是.