Как получить вложенный словарь, используя методы расширения в C #? - PullRequest
0 голосов
/ 07 ноября 2019

Я хочу создать функцию, которая получает CSV-файл и возвращает вложенный словарь. Формат файла CSV выглядит следующим образом (но между значениями нет пробелов):

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" } }

и обратитесь к словарю в основной программе.

Проблема в том, что тип возвращаемой функциине совпадает с результатом методов расширения. Я думал, что это будет Dictionary<string, Dictionary<string, string>>, но это Dictionary<string, <anonymous type: string, string>>. Как я могу изменить анонимный тип на вложенный тип словаря? Возможно ли сделать это в методе расширения?

1 Ответ

1 голос
/ 07 ноября 2019

Мне кажется, что вы могли бы заменить эту последнюю строку

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> в качестве значения вместоиспользуя анонимный тип.

...