linq中方法Sum的这三个调用有什么区别?
decimal Sum1 = Shops.Sum(x => x.Amount);
decimal Sum2 = Shops.Select(x => x.Amount).Sum();
decimal Sum3 = Shops.Select(x => x).Sum(x => x.Amount);
答案 0 :(得分:1)
上述三种方法中的每种方法都有细微的差别,尽管您目前如何调用每种方法,但它们应该产生相同的金额。
decimal Sum1 = Shops.Sum(x => x.Amount);
使用Func
重载来标识要为源集合求和的属性,并在迭代源时在内部使用。
decimal Sum2 = Shops.Select(x => x.Amount).Sum();
创建一个新的IEnumerable<T>
投影,然后将其传递到.Sum()
扩展方法并进行内部迭代和求和。
decimal Sum3 = Shops.Select(x => x).Sum(x => x.Amount);
除了(可能)产生额外的开销和混乱之外什么也不做,因为它与第一个示例相同,同时允许您沿途创建新的投影。在这种情况下,它基本上没用。
答案 1 :(得分:-1)
最终总和没有差异。
区别在于表达树的沉着。这些都是相似的,但执行方式不同,因为表达式树的构建方式不同。
LINQ适用于延迟执行。在这种情况下,它会推迟到Sum
的调用。通常,延迟执行通过枚举可枚举来实现。在每种情况下,构建的可枚举都是不同的。
Shops.Sum(x => x.Amount);
在这种情况下,Enumerable已经构建,它是Shops
。对Sum
的调用枚举Shops
枚举,并为每个元素添加x.Amount
的值。然后返回该值。
Shops.Select(x => x.Amount).Sum();
在这种情况下,正在构建的Enumerable是一个&#34;投影&#34; (Select
)。预测只会从每个Amount
元素中获取Shop
。在此枚举上使用Sum
迭代每个单独的数量并添加它。然后返回该值。
Shops.Select(x => x).Sum(x => x.Amount);
可以编译出这种情况。 Select(x => x)
实际上并没有产生任何不同的东西。所以这很可能与第一种情况相同。