创建一个字典,键代表列表中的元素

tit*_*xid 3 c# linq

我想创建一个DictionaryKeys的代表来自一个元素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 内部的演员列表,但我不知道如何。

Dmi*_*nko 5

您可以尝试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)