【问题标题】:Combining multiple dictionary where key matches组合键匹配的多个字典
【发布时间】:2017-02-08 08:39:03
【问题描述】:

我得到一个

Dictionary<DateTime,double>() 

来自应用程序的不同部分。这可以返回许多字典,这就是我将它们存储在列表中的原因:

var masterlist = new List<Dictionary<DateTime, double>>();

我现在想组合 DateTime 键相等的字典,并将结果转换为数组 object[,] 以便每一行看起来像这样:

DateTime, double_d1, double_d2, ... double_dn

其中 d1, d2, ..., dn 是列表中字典的模拟代码。 请问我该怎么做?

【问题讨论】:

  • 你有没有尝试过?
  • 一个List&lt;object[,]&gt;?因为你可以有不同的时间相等

标签: c# linq dictionary grouping


【解决方案1】:

你可以试试这个:

    Dictionary<DateTime, double[]> preResult = masterlist.SelectMany(s => s).GroupBy(k => k.Key)
        .ToDictionary(k => k.Key, v => v.Select(s => s.Value).ToArray());

   var result = preResult.Select(s =>
    {
        var res = new List<object>(); 

        res.Add(s.Key);
        res.AddRange(s.Value.Cast<object>());

        return res.ToArray(); 

    }).ToArray();

【讨论】:

  • 我更喜欢仅字典的解决方案,因为它直观且高效
【解决方案2】:

这里是与@Ksv3n 类似的解决方案,其结果是以DateTime 字典为键,双精度列表为值:

Dictionary<DateTime, List<double>> masterDic = masterlist 
    .SelectMany(dic => dic)
    .GroupBy(dic => dic.Key)
    .ToDictionary(dic => dic.Key, values => values.Select(v => v.Value).ToList());

【讨论】:

    【解决方案3】:

    您可以使用Dictionary&lt;DateTime, List&lt;double&gt;&gt;。您遍历您拥有的字典列表并将条目添加到该字典中。

    var masterlist = new List<Dictionary<DateTime, double>>();
    
    Dictionary<DateTime, List<double>> dtDoubles = new Dictionary<DateTime, List<double>>();
    foreach (var item in masterlist)
    {
        foreach (var kvPair in item)
        {
            if (!dtDoubles.ContainsKey(kvPair.Key))
            {
                dtDoubles.Add(kvPair.Key, new List<double> {kvPair.Value});
            }
            else
            {
                dtDoubles[kvPair.Key].Add(kvPair.Value);
            }
        }
    }
    

    【讨论】:

      【解决方案4】:

      这个怎么样:

              Dictionary<DateTime, List<double>> result =
              masterlist.Select(x => x.AsEnumerable())
                  .Aggregate((a, b) => a.Concat(b))
                  .GroupBy(x => x.Key)
                  .ToDictionary(k => k.Key, v => v.Select(x => x.Value).ToList());
      

      【讨论】:

        猜你喜欢
        • 2021-01-10
        • 2021-06-24
        • 1970-01-01
        • 1970-01-01
        • 2021-07-26
        • 2021-11-17
        • 1970-01-01
        • 2011-07-09
        • 2011-10-19
        相关资源
        最近更新 更多