我所寻找的最接近的解决方案就是这个帖子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; }
}
我从第三方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
}
}
}
}
}
在这种情况下,如何明确指定类型参数?感谢。
答案 0 :(得分: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
。
答案 1 :(得分:2)
SelectMany
将每个项目投射到项目的序列中(然后展平它)。您的外部SelectMany
会将每个项目投影到一个序列中,但您的内部SelectMany
会将每个项目投影到不是序列的单个项目中。如果您想将序列中的每个项目投影到单个项目,那么您需要使用Select
,而不是SelectMany
。