我知道我可以用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)
当然,这会在列表上重复两次,但在大多数情况下,我希望不会引起注意.
归档时间: |
|
查看次数: |
22673 次 |
最近记录: |