C#对象列表,如何获取属性的总和

时间:2010-12-04 04:07:13

标签: c# list sum

我有一个对象列表。单个对象条目的一个属性是金额。我如何得到金额总和?

如果我的列表是double类型,我可能会做这样的事情:

double total = myList.Sum();

但是我想要类似的东西,但这种语法不正确。

double total = myList.amount.Sum();

我应该如何完成这项工作?我希望尽可能使用Sum函数,而不是循环并计算值。

4 个答案:

答案 0 :(得分:261)

using System.Linq;

...

double total = myList.Sum(item => item.Amount);

答案 1 :(得分:30)

如果您需要对符合特定条件的物品进行此操作......

double total = myList.Where(item => item.Name == "Eggs").Sum(item => item.Amount);

答案 2 :(得分:9)

另一种选择:

myPlanetsList.Select(i => i.Moons).Sum();

答案 3 :(得分:1)

以下是您可以运行以进行此类测试的示例代码:

var f = 10000000;
var p = new int[f];

for(int i = 0; i < f; ++i)
{
    p[i] = i % 2;
}

var time = DateTime.Now;
p.Sum();
Console.WriteLine(DateTime.Now - time);

int x = 0;
time = DateTime.Now;
foreach(var item in p){
   x += item;
}
Console.WriteLine(DateTime.Now - time);

x = 0;
time = DateTime.Now;
for(int i = 0, j = f; i < j; ++i){
   x += p[i];
}
Console.WriteLine(DateTime.Now - time);

复杂对象的相同示例是:

void Main()
{
    var f = 10000000;
    var p = new Test[f];

    for(int i = 0; i < f; ++i)
    {
        p[i] = new Test();
        p[i].Property = i % 2;
    }

    var time = DateTime.Now;
    p.Sum(k => k.Property);
    Console.WriteLine(DateTime.Now - time);

    int x = 0;
    time = DateTime.Now;
    foreach(var item in p){
        x += item.Property;
    }
    Console.WriteLine(DateTime.Now - time);

    x = 0;
    time = DateTime.Now;
    for(int i = 0, j = f; i < j; ++i){
        x += p[i].Property;
    }
    Console.WriteLine(DateTime.Now - time);
}

class Test
{
    public int Property { get; set; }
}

关闭编译器优化的结果是:

00:00:00.0570370 : Sum()
00:00:00.0250180 : Foreach()
00:00:00.0430272 : For(...)

并且第二次测试是:

00:00:00.1450955 : Sum()
00:00:00.0650430 : Foreach()
00:00:00.0690510 : For()

看起来LINQ通常比foreach慢(...)但对我来说奇怪的是foreach(...)似乎比for循环更快。