我有这个结构
class DailyData
{
public double A=0.0;
public double B=0.0;
public double C=0.0;
}
SortedDictionary<DateTime,DailyData[]> Data = new SortedDictionary<DateTime,DailyData[]>();
var LongData = Data.Skip(Math.Max(0, Data.Count() - 90)).Take(90);
如何在字典的某个部分中对特定值求和(或其他操作)?
即我想在LongData中总结所有“A”?
修改
实际上,我不想要所有的“A”。我只想对我的DailyData数组的元素(索引)N的所有“A”求和。我应该先说明抱歉
答案 0 :(得分:8)
从类型中解决。我们有什么? longData
的类型为IEnumerable<KeyValuePair<DateTime, DailyData[]>
。我们需要什么? IEnumerable<double>
,我们可以求和。我们怎么去那里?
首先要获得DailyData[]
的序列:
IEnumerable<DailyData[]> q1 = from pair in longData
select pair.Value;
好的,现在我们有了,让我们制作一个DailyData
的序列:
IEnumerable<DailyData> q2 = from array in q1
from element in array
select element;
现在我们可以获得所需的双打序列:
IEnumerable<double> q3 = from data in q2
select data.A;
现在我们可以总结一些事情:
double sum = q3.Sum();
现在我们已经将它分解为一系列小步骤,我们可以看到如何将它组合成更简洁的东西:
var query = from pair in longData
from element in pair.Value
select element.A;
double sum = query.Sum();
有意义吗?使用LINQ时,需要记住一些事项:
答案 1 :(得分:3)
有几个选择。您可以使用Sum
方法,如下所示:
var sum = LongData.SelectMany(x => x.Value).Sum(x => x.A);
或者这个:
var sum = LongData.Sum(x => x.Value.Sum(y => y.A));
或者这个:
var sum =
(from x in LongData
from y in x.Value
select y.A).Sum();
答案 2 :(得分:3)
您可以使用LINQ的内置sum运算符,只需选择所有值:
var sum = Data.Sum(x => x.Value.Sum(y => y.A));
答案 3 :(得分:2)
我想在LongData中总结所有“A”
LongData.SelectMany( x=>x.Value ).Sum( x=>x.A );