我有这个结构

    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之前,不会实际执行任何查询。

10-07 19:42