我有这个结构
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”求和。我应该早点说明抱歉
最佳答案
从类型中找出答案。我们有什么? 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;
现在我们可以获得所需的 double 序列:
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 和 query 除了分配 query 外什么都不做。在调用 Sum 之前,不会实际执行任何查询。
关于c# - 使用 linq 对复杂字典求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16179937/