使用linq求一个复杂的字典

Man*_*oon 1 c# linq dictionary

我有这个结构

    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);
Run Code Online (Sandbox Code Playgroud)

如何在字典的某个部分中对特定值求和(或其他操作)?

即我想在LongData中总结所有"A"?

编辑

实际上,我不想要所有的"A".我只想对我的DailyData数组的元素(索引)N的所有"A"求和.我应该早些时候指出抱歉

Eri*_*ert 8

从类型中解决.我们有什么?longData是类型的IEnumerable<KeyValuePair<DateTime, DailyData[]>.我们需要什么? IEnumerable<double>,我们可以总结.我们怎么去那里?

首先是获得一系列DailyData[]:

IEnumerable<DailyData[]> q1 = from pair in longData 
                              select pair.Value;
Run Code Online (Sandbox Code Playgroud)

好了,现在我们有了,让我们做一个序列DailyData:

IEnumerable<DailyData> q2 = from array in q1 
                            from element in array
                            select element;
Run Code Online (Sandbox Code Playgroud)

现在我们可以获得所需的双打序列:

IEnumerable<double> q3 = from data in q2
                         select data.A;
Run Code Online (Sandbox Code Playgroud)

现在我们有一些可以总结的东西:

double sum = q3.Sum();
Run Code Online (Sandbox Code Playgroud)

现在我们已经将它分解为一系列小步骤,我们可以看到如何将它组合成更简洁的东西:

var query = from pair in longData 
            from element in pair.Value
            select element.A;
double sum = query.Sum();
Run Code Online (Sandbox Code Playgroud)

合理?使用LINQ时,需要记住一些事项:

  • 使用类型系统指导您.类型系统指示数据的"形状",因此遵循它.
  • 将查询细分为许多子查询,每个子查询都执行一个简单的步骤.然后,如果你愿意,你可以弄清楚如何将它写成简洁的东西.
  • 永远记住查询理解表达式的值是查询而不是结果.q1,q2,q3和查询都不会分配查询.在调用Sum之前,没有任何查询实际执行.