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

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

如果我的列表是doubletypes的,我可能可以这样做:

double total = myList.Sum(); 

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

 double total = myList.amount.Sum(); 

我应该如何去做到这一点? 我希望尽可能使用Sum函数,而不是循环和计算值。

 using System.Linq; 

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

如果您需要在符合特定条件的项目上执行此操作…

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

另一种select:

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

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

 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(...) 

第二个testing是:

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

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