C# 使用表示列表中元素的键创建字典
我想创建一个C# 使用表示列表中元素的键创建字典,c#,linq,C#,Linq,我想创建一个字典,其中键s表示列表中的元素。每个列表元素都必须存在于该词典中 示例: 电影有演员名单 现在我想要一个演员出演的电影列表。如果电影中有多个演员,那么每个演员都应该在自己的列表中有电影 我的数据结构如下: public class MovieData { public List<string> Actors { get; set;} public string Title { get; set; } public DateTime ReleaseD
字典
,其中键
s表示列表
中的元素。每个列表元素都必须存在于该词典中
示例:电影有演员名单 现在我想要一个演员出演的电影列表。如果电影中有多个演员,那么每个演员都应该在自己的列表中有电影 我的数据结构如下:
public class MovieData
{
public List<string> Actors { get; set;}
public string Title { get; set; }
public DateTime ReleaseDate { get; set; }
public string FilePath { get; set; }
}
我提出了以下代码,但它只关注列表中的第一个参与者(FirstOrDefault()
)。因此,名单中的其他参与者被忽略
var actorMovieList = movieDataList
.ToLookup(movie => movie
.Actors
.FirstOrDefault(), movie => movie);
我如何将其他演员包括在名单中?我必须遍历lambda中的参与者列表,但我不知道如何操作。您可以尝试
SelectMany
将初始列表展平为
{actor, title}
记录,然后将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());
以下是一个快速解决方案,可提供所需的结果:
假设您有这样一个电影数据列表:
Alice Stevens => { "Movie1", "Movie2" }
Bob Smith => { "Movie1" }
John Doe => { "Movie3" }
var movieDataList = new List<MovieData> { movie1, movie2, movie3 };
现在,让我们制作一本词典,其中包含演员姓名和电影列表
var allActorMovieList = new Dictionary<string, List<string>>();
foreach (var actor in actors)
{
// List of the movies of the actor
var actorMovieList = movieDataList
.Where(movieData => movieData.Actors.Contains(actor))
.Select(movieData => movieData.Title)
.ToList();
allActorMovieList.Add(actor, actorMovieList);
}
var allActorMovieList=new Dictionary();
foreach(演员中的演员)
{
//演员的电影列表
var actorMovieList=movieDataList
.Where(movieData=>movieData.Actors.Contains(actor))
.Select(movieData=>movieData.Title)
.ToList();
添加(actor,actorMovieList);
}
现在allActorMovieList
包含所有演员及其电影您可以首先将movieDataList
展平(使用SelectMany
方法)放入演员和电影标题的集合,然后在此集合中使用方法。它允许您在最终结果中包含所有作者
var flatQuery =
from movie in movies
from actor in movie.Actors
select new {movie, actor};
var lookup = flatQuery.ToLookup(
pair => pair.actor,
pair => pair.movie.Title);
var aliceStevensMovies = lookup["Alice Stevens"].ToList();
var amyBMovies = lookup["Amy B"].ToList(); //empty, not keyNotFound
var movieDataList=newlist(){movie1,movie2,movie3};
var结果=电影数据列表
.选择许多(m=>m.演员
.选择(a=>新建
{
演员,
电影=m.标题
}))
.ToLookup(pair=>pair.Actor,pair=>pair.Movie);
foreach(结果中的var项目)
{
WriteLine($“{item.Key}{string.Join(“,”,item)}”);
}
输出将如下所示
var allActorMovieList = new Dictionary<string, List<string>>();
foreach (var actor in actors)
{
// List of the movies of the actor
var actorMovieList = movieDataList
.Where(movieData => movieData.Actors.Contains(actor))
.Select(movieData => movieData.Title)
.ToList();
allActorMovieList.Add(actor, actorMovieList);
}
var flatQuery =
from movie in movies
from actor in movie.Actors
select new {movie, actor};
var lookup = flatQuery.ToLookup(
pair => pair.actor,
pair => pair.movie.Title);
var aliceStevensMovies = lookup["Alice Stevens"].ToList();
var amyBMovies = lookup["Amy B"].ToList(); //empty, not keyNotFound