Ответ 1
using System.Linq;
...
double total = myList.Sum(item => item.Amount);
У меня есть список объектов. Одно свойство отдельной записи объекта - это сумма. Как получить сумму суммы?
Если мой список имеет тип double, я могу сделать что-то вроде этого:
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);
Другая альтернатива:
myPlanetsList.Select(i => i.Moons).Sum();
Вот пример кода, который вы могли бы выполнить для проведения такого теста:
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 (...) кажется быстрее, чем для цикла.