如何使用LINQ将类中的嵌套字典扁平化

3
我找到的最接近我所需的解决方案是这个主题 如何使用linq表达式展平嵌套对象

但是我尝试了那种方法后出现了错误

方法“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; }
}

我从第三方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
        }
      }
    }
  }
}

在这种情况下,我应该如何明确指定类型参数呢?谢谢。

2个回答

3

太多的 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
@Justin 没注意到。 - xanatos

2

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


感谢您的解释。 - Justin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接