C # Список объектов, как я могу получить сумму свойства - PullRequest
131 голосов
/ 04 декабря 2010

У меня есть список объектов. Одним из свойств отдельной записи объекта является сумма. Как получить сумму?

Если бы мой список был типа double, я мог бы сделать что-то вроде этого:

double total = myList.Sum();

Однако я хочу что-то похожее на это, но этот синтаксис неверен.

double total = myList.amount.Sum();

Как мне это сделать? Я хотел бы использовать функцию Sum, если это возможно, вместо того, чтобы перебирать и вычислять значение.

Ответы [ 4 ]

264 голосов
/ 04 декабря 2010
using System.Linq;

...

double total = myList.Sum(item => item.Amount);
30 голосов
/ 19 октября 2014

А если вам нужно сделать это на предметах, которые соответствуют определенному условию ...

double total = myList.Where(item => item.Name == "Eggs").Sum(item => item.Amount);
9 голосов
/ 23 марта 2016

Другая альтернатива:

myPlanetsList.Select(i => i.Moons).Sum();
1 голос
/ 19 февраля 2016

Вот пример кода, который вы можете запустить, чтобы выполнить такой тест:

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 (...), кажется, быстрее, чем для цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...