c#计算总和

时间:2011-04-17 19:05:00

标签: c#

var deviation = frequencies.Sum(value => (value.Key * value.Value))

任何人都可以告诉我这笔钱的工作原理吗?

8 个答案:

答案 0 :(得分:1)

SumIEnumerable<T>的扩展方法,是LINQ的一部分。

它遍历集合中的所有元素,并使用传入的Lambda Expression获取每个项目的值。它们将它们相加并返回结果。

答案 1 :(得分:0)

假设frequenciesDictionary,其中包含查看特定数字的次数(即key是数字,value是该数字的出现次数),这将遍历字典中的所有键值对,并为每个计算key *值的乘积并将它们全部加起来。 sum方法本身是一个扩展方法,您可以传递一个lambda表达式,该表达式说明了每个项目的添加方式。

答案 2 :(得分:0)

它使用Sum() LINQ方法。来自MSDN

  

计算序列的总和   通过获得的双值   在每个上调用转换函数   输入序列的元素。

它实际上等同于frequencies.Select(value => (value.Key * value.Value)).Sum(),它遍历列表/字典中的每个项目,并将字典键乘以它所代表的值。然后它将这些计算值中的每一个加在一起。

答案 3 :(得分:0)

它使用lambda表达式 - 请参阅http://msdn.microsoft.com/en-us/library/bb397687.aspx

lambda表达式表示“给定值,我将获取值的值和值的值,并将它们相乘”。 Sum函数可能会将该函数应用于每个频率元素,并将每个计算的结果汇总在一起(我在这里猜测,但没有足够的信息可以告诉)。

答案 4 :(得分:0)

查看Jon Skeet撰写的这篇博文,其中重新实现了Sum:

Reimplementing LINQ to Objects: Part 28 - Sum

答案 5 :(得分:0)

我猜频率是IEnumerable,所以Sum方法实际上是this Sum method它的作用是为IEnumerable中的每个元素调用一个方法,方法是:

return value.Key * value.Value;

所以偏差是所有这些值的总和。 (这不是偏差)

答案 6 :(得分:0)

Sum只是在你的案例中迭代一个keyvalue对

var deviation = frequencies.Sum(value => (value.Key * value.Value))

的简写
var sum = 0.0M; // or 0.0D; // or what ever type?
foreach(var pair in frequencies) {
    sum += (pair.Key * pair.Value);
}

答案 7 :(得分:0)

这是我最简单的Sum方法实现

public static class LinqExt 
    {
        public static decimal? MySum<TSource>(this IEnumerable<TSource> list, Func<TSource,decimal?> selector)
        {
            decimal? result = 0;
            foreach (var p in list) 
            {
                result += selector(p);
            }
            return result;
        }
    }

它不检查任何异常,并完全信任传入的参数值为true。此外,我会问社区应该如何初始化十进制结果。 你可以使用完全像Sum这样的MySum方法

List<int> values = new List<int>{1,2,3,4};
var sum = values.MySum(x=>x);

这将为您提供列表中所有整数的总和