c#对象列表,我如何得到一个属性的和

我有一个对象列表。单个对象条目的一个属性是数量。我怎么得到金额的总和?

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

double total = myList.Sum();

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

double total = myList.amount.Sum();

我该怎么做呢?如果可能的话,我希望使用Sum函数,而不是循环遍历和计算值。

276268 次浏览
using System.Linq;

...

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

如果你需要在符合特定条件的物品上做这件事……

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

下面是你可以运行来进行这样的测试的示例代码:

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循环快。

另一个选择:

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