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(…)似乎比循环更快。