我有这个结构
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数组的element(index)N的所有“ A”加起来。我应该早点指定对不起
最佳答案
从类型中计算出来。我们有什么? 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时,要记住一些事情:
使用文字系统指导您。类型系统指示数据的“形状”,因此请遵循它。
将查询分为许多子查询,每个子查询都执行一个简单的步骤。然后,您可以根据需要弄清楚如何将其写成简洁的内容。
始终记住,查询理解表达式的值是查询而不是结果。 q1,q2,q3和查询除了分配查询外均不起作用。在调用Sum之前,不会实际执行任何查询。