Linq中Sum()的几种语法之间的差异

时间:2016-09-07 19:29:08

标签: c# linq sum

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);

2 个答案:

答案 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)实际上并没有产生任何不同的东西。所以这很可能与第一种情况相同。