我想创建一个Dictionary在Keys的代表来自一个元素List。每个列表元素都必须出现在这个字典中。
示例:
一部电影有一个演员列表。
现在我想要一个演员出演的电影列表。如果电影有多个演员,每个演员都应该在自己的列表中列出这部电影。
我有一个这样的数据结构:
public class MovieData
{
public List<string> Actors { get; set;}
public string Title { get; set; }
public DateTime ReleaseDate { get; set; }
public string FilePath { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
一个小例子来说明这一点:
var movie1 = new MovieData {
Title = "Movie1",
Actors = new List<string> { "Bob Smith", "Alice Stevens"}};
var movie2 = new MovieData {
Title = "Movie2",
Actors = new List<string> { "Alice Stevens"}};
var movie3 = new MovieData {
Title = "Movie3",
Actors = new List<string> { "John Doe" }};
Run Code Online (Sandbox Code Playgroud)
所需的结果应如下所示:
Alice Stevens => { "Movie1", "Movie2" }
Bob Smith => { "Movie1" }
John Doe => { "Movie3" }
Run Code Online (Sandbox Code Playgroud)
我想出了以下代码,但它只关注列表中的第一个角色 ( FirstOrDefault())。所以列表中的其他演员被忽略。
var actorMovieList = movieDataList
.ToLookup(movie => movie
.Actors
.FirstOrDefault(), movie => movie);
Run Code Online (Sandbox Code Playgroud)
我如何将其他演员包括在列表中?我必须遍历 lambda 内部的演员列表,但我不知道如何。
您可以尝试SelectMany以扁平化的初始List<List<string>>成
{actor, title}
Run Code Online (Sandbox Code Playgroud)
记录,然后将GroupBy它们分组actor到所需的字典中:
var result = movieDataList
.SelectMany(movie => movie
.Actors
.Select(actor => new { // from now we have flat cursor of
actor = actor, // {actor, title} records
title = movie.Title
}))
.GroupBy(record => record.actor, // ... which we group by actor:
record => record.title) // actor and movies (s)he played in
.ToDictionary(group => group.Key, // or ToLookUp()
group => group.ToList());
Run Code Online (Sandbox Code Playgroud)