LINQ sum项目集合返回带有结果的对象(多列)

Jon*_*Jon 10 c# linq

我知道我可以用foreach做下面的事情,但是想知道是否有一个干净且"性感"的方式用LINQ做这个.

public class item
{
    public int total { get; set; }
    public int net { get; set; }
}


class Program
{
    static void Main(string[] args)
    {
        List<item> items = new List<item>()
                               {
                                   new item() { total = 123, net = 423},
                                   new item() { total = 432, net = 54},
                                   new item() { total = 33, net = 57654},
                                   new item() { total = 33, net = 423},
                                   new item() { total = 3344, net = 423},
                                   new item() { total = 123, net = 423},
                                   new item() { total = 123, net = 98},
                                   new item() { total = 123, net = 867},
                                   new item() { total = 123, net = 876},
                                   new item() { total = 123, net = 423},
                                   new item() { total = 123, net = 543},
                                   new item() { total = 543, net = 345},
                               };

        item i = new item();
        foreach (var item in items)
        {
            i.net += item.net;
            i.total += item.total;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是,对于给定的对象列表,对每个列/字段求和,并返回一个具有每个值之和的单个对象.

我试过了:

var result = (from e in items
                     select new
                                {
                                    NET_GRAND = e.net,
                                    TOTAL_GRAND = e.total
                                }).ToList();
Run Code Online (Sandbox Code Playgroud)

以下的变化,但没有运气:

 var result = (from t in items
                     group t by new {t.net, t.total}
                     into grp
                     select new
                                {
                                    NET_GRAND = grp.Sum(t => t.net),
                                    TOTAL_GRAND = grp.Sum(t => t.total)
                                }).GroupBy(x => new { x.NET_GRAND, x.TOTAL_GRAND }).ToList();
Run Code Online (Sandbox Code Playgroud)

编辑

应该指出效率在这里以及性感都很重要.

Aak*_*shM 16

如果你不关心迭代列表两次,

var i = new item
    { 
        net = items.Sum(it => it.net), 
        total = items.Sum(it => it.total) 
    };
Run Code Online (Sandbox Code Playgroud)

如果你对迭代列表两次保养(如你可能会,如果你正在做这一个IEnumerable来历不明的),

var i = items.Aggregate(new item(), 
    (accumulator, it) => 
        new item 
        {
            net = accumulator.net + it.net, 
            total = accumulator.total + it.total 
        } 
);
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 11

看起来你真的想要:

var result = new {
    NetGrand = items.Sum(t => t.net),
    TotalGrand = items.Sum(t => t.total)
};
Run Code Online (Sandbox Code Playgroud)

另一方面,我可能只是将它们分成两个不同的局部变量:

var netGrand = items.Sum(t => t.net);
var totalGrand = items.Sum(t => t.total);
Run Code Online (Sandbox Code Playgroud)

当然,这会在列表上重复两次,但在大多数情况下,我希望不会引起注意.