1

我有这个结构

    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”求和。我应该早点说对不起

4

4 回答 4

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 时,需要记住以下几点:

  • 使用类型系统来指导您。类型系统表示数据的“形状”,因此请遵循它。
  • 将查询分解为许多子查询,每个子查询执行一个简单的步骤。然后,如果您愿意,您可以在以后弄清楚如何将其写成简洁的东西。
  • 永远记住,查询理解表达式的值是查询而不是结果。q1, q2, q3 和 query 除了分配query之外没有任何作用。在调用 Sum 之前,实际上不会执行任何查询。
于 2013-04-23T22:14:06.133 回答
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();
于 2013-04-23T22:03:55.647 回答
3

您可以使用 LINQ 的内置 sum 运算符,您只需选择所有值:

var sum = Data.Sum(x => x.Value.Sum(y => y.A));
于 2013-04-23T22:07:08.617 回答
2

我想总结 LongData 中的所有“A”

LongData.SelectMany( x=>x.Value ).Sum( x=>x.A );
于 2013-04-23T22:05:52.627 回答