Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用LINQ展平类内的嵌套字典_C#_Linq - Fatal编程技术网

C# 如何使用LINQ展平类内的嵌套字典

C# 如何使用LINQ展平类内的嵌套字典,c#,linq,C#,Linq,与我所寻找的最接近的解决方案是这个线程 但我在尝试这种方法时出错了 无法从用法推断方法“System.Linq.Enumerable.SelectMany(System.Collections.Generic.IEnumerable,System.Func>)”的类型参数。尝试显式指定类型参数 我的代码: var aa = t.data.SelectMany(x => x.Value.innerData.SelectMany(y => new

与我所寻找的最接近的解决方案是这个线程

但我在尝试这种方法时出错了

无法从用法推断方法“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; }
}

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

太多
选择多个

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

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

您的代码解决了我的问题,但不理解您所说的“注意,在所有这些操作中,您正在丢失TData.data.key,因为您只访问TData.data.Value”。在最后的选择中,我使用TData键作为“url”。你能解释一下吗?@贾斯汀没有注意到。谢谢你的解释。
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,
        }));