c# - 使用 linq 对复杂字典求和

标签 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);

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

即我想对 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/

相关文章:

c# - 在按匿名类型分组的 Entity Framework 查询中选择分组键最终会为每个分组对象返回一个键

c# - LINQ 过滤器列表并排除 MAX 值

python - 标量乘法字典值

python - 根据条件合并两个字典列表

python : group by multiple dictionary keys

c# - 获取相同类型对象的两个列表之间的差异

c# - 当作为新进程从 ASP .NET Web 应用程序中运行时,mysqldump 无法正常工作

c# - 缺少 VS2017 中的一些 Web 开发实用程序

c# - Linq 查询性能,比较编译查询与非编译查询

c# - 组合两个 linq 表达式