如何在 C# 中使用扩展方法获取嵌套字典?

How to get a nested dictionary using extension methods in C#?

我想创建一个接收 csv 文件和 return 嵌套字典的函数。 csv 文件格式如下所示(但值之间没有 space):

FilmMaker,   MovieTitle,      EndDate
FunnyM,      F1,              20191210
FunnyM,      F2,              20191211
FunnyM,      F3,              20191212
FunnyM,      F4,              20191213
FunnyM,      F5,              20191214
SadM,        S1,              20191210
SadM,        S2,              20191211
SadM,        S3,              20191212
SadM,        S4,              20191213
SadM,        S5,              20191214
ScaryM,      C1,              20191210
ScaryM,      C2,              20191211
ScaryM,      C3,              20191212
ScaryM,      C4,              20191213
ScaryM,      C5,              20191214

这是我正在处理的功能:

public static Dictionary<string, Dictionary<string, string>> CSV_to_dictionary(String csvFileName)
{
    var data = File.ReadAllLines("movies.csv", Encoding.Default);

    var d = data.Skip(1)
                .Select(line => line.Split(',').ToList())
                .Select(a => new { FilmMaker= a[0], MovieTitle= a[1], EndDate= DateTime.ParseExact(a[2], "yyyyMMdd", CultureInfo.InvariantCulture) })
                .GroupBy(o => o.FilmMaker)
                .Select(g => new { FilmMaker= g.Key, info = g.Where(m => m.EndDate> new DateTime(2019, 12, 10)).OrderBy(m => m.EndDate).Skip(1).First() })
                .ToDictionary(m => m.info.MovieTitle,
                              m => new { FilmMaker= m.FilmMaker, EndDate= m.info.EndDate.ToString("yyyyMMdd") });

    return d;
}

主要目标是在某些条件下为每个 FilmMaker 提取一部电影并制作一个嵌套字典,例如:

dictionary_movie = { "F3": { "FilmMaker":"FunnyM", "EndDate":"20191212" },
                     "S3": { "FilmMaker":"SadM",   "EndDate":"20191212" },
                     "C3": { "FilmMaker":"ScaryM", "EndDate":"20191212" } }

并在主程序中查阅词典

问题是函数的 return 类型与扩展方法的结果不同。我以为它会是 Dictionary<string, Dictionary<string, string>>,但它是 Dictionary<string, <anonymous type: string, string>>。如何将匿名类型更改为嵌套字典类型?是否可以用扩展方法来实现?

我觉得你可以替换最后一行

m => new { FilmMaker= m.FilmMaker, EndDate= m.info.EndDate.ToString("yyyyMMdd") }

用这个

m => new Dictionary<string, string> { { "FilmMaker", m.FilmMaker }, { "EndDate", m.info.EndDate.ToString("yyyyMMdd") } }

它会创建一个新的 Dictionary<string, string> 作为值,而不是使用匿名类型。