【问题标题】:How to flatten nested dictionaries within Class using LINQ如何使用 LINQ 在类中展平嵌套字典
【发布时间】:2015-09-05 17:05:03
【问题描述】:

最接近我正在寻找的解决方案是这个线程How to flatten nested objects with linq expression

但我尝试这种方法时出错

无法从用法中推断方法“System.Linq.Enumerable.SelectMany(System.Collections.Generic.IEnumerable, System.Func>)”的类型参数。尝试明确指定类型参数。

我的代码:

var aa = t.data.SelectMany(x => 
                    x.Value.innerData.SelectMany(y => new { /*Error at this SelectMany*/
                    url = x.Key,
                    disp = x.Value.disp,
                    date = y.Key,
                    count = y.Value.count,
                    rank = y.Value.rank,
       }));

我的课:

public class TData {
    public Dictionary<string, TDetail> data { get; set; }
}

public class TDetail {
    public string disp { get; set; }

    [Newtonsoft.Json.JsonProperty("data")]
    public Dictionary<string, Metrics> innerData { get; set; }

}

public class Metrics {
    public string count { get; set; }
    public string rank { get; set; }
}

我从第 3 方 API 获得的 JSON 如下所示:

{
  "data": {
    "abc.com": {
      "disp": "#712176",
      "data": {
        "2015-02-08": {
          "count": 4,
          "rank": 5.8
        },
        "2015-02-23": {
          "count": 3,
          "rank": 8.3
        },
        "2015-03-14": {
          "count": 5,
          "rank": 3.7
        }
      }
    },
    "nbc.com": {
      "disp": "#822176",
      "data": {
        "2015-02-08": {
          "count": 3,
          "rank": 5.5
        },
        "2015-02-23": {
          "count": 5,
          "rank": 8.4
        },
        "2015-03-14": {
          "count": 7,
          "rank": 4.7
        }
      }
    }
  }
}

在这种情况下如何显式指定类型参数?谢谢。

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    太多SelectMany:

    var t = new TData(); // your TData
    
    var aa = t.data.SelectMany(x =>
            x.Value.innerData.Select(y => new
            {
                url = x.Key,
                disp = x.Value.disp,
                date = y.Key,
                count = y.Value.count,
                rank = y.Value.rank,
            }));
    

    内层必须是Select

    【讨论】:

    • 您的代码解决了我的问题,但不明白您所说的“请注意,在所有这一切中您都丢失了 TData.data.Keys,因为您只访问 TData.data.Value” .我在最终选择中使用 TData 的键作为“url”。你能解释一下吗?
    • @Justin 没注意到。
    【解决方案2】:

    SelectMany 将每个单独的项目投射到项目的序列 中(然后将其展平)。您的外部SelectMany 将每个项目投影到一个序列中,但您的内部SelectMany 将每个项目投影到不是序列的单个项目中。如果您想将序列中的每个项目投影到一个单个项目,那么您需要使用Select,而不是SelectMany

    【讨论】:

    • 感谢您的解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 2020-11-29
    • 2019-11-15
    • 2012-09-06
    相关资源
    最近更新 更多