Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用表示列表中元素的键创建字典_C#_Linq - Fatal编程技术网

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