通过从IGrouping的每个组中选择一个项来构建列表

时间:2011-05-09 19:49:29

标签: c# asp.net

假设我有一系列具有一系列开始时间的电影

public class Show
{
    public string Name { get; set; }      
    public DateTime Start { get; set; }
}

电影1 - 8:00
电影1 - 10:00
电影1 - 12:00
电影2 - 9:00
电影2 - 11:30
电影2 - 15:00
电影3 - 12:00
电影3 - 13:00

我最终得到了一个分组列表,其中电影的名称是关键。我想从每个小组中抽出一次,然后创建一个List<DateTime>

既然有3个项目有8次,我应该有18个不同的列表。

8:00 - 9:00 - 12:00
8:00-9:00-13:00 10:00-9:00-12:00 等

我尝试循环浏览群组

foreach (var movie in movies)
{
  foreach (var time in movie)
  {
     // Start looping through other groups and movies
  }
}

无论如何,这可能是一个糟糕的解决方案,或者我没有做正确的事情,因为我最终得到了List<DateTime>的列表,我不得不开始循环遍历这些列表来构建更多列表,只需从中获取一个项目每个...这太可怕了。常规嵌套foreach将无法正常工作,因为我最终得到了我的8:00电影1,其中包含了电影2和电影2的所有实例。 3,所以我不得不将这些名单分开,这样就太乱了。

有什么建议可以更好地解决这个问题吗?

要点:

理解它的一种更简单的方法就是这样,你想在一天内看到3部电影。你知道你想看哪3个,你不知道你想看到它们的时间。

我需要一个能够显示所有选项的列表。你现在可以看这部电影,此时此电影......

e.g。

列表1 - 电影1 - 8:00,电影2 - 9:00,电影3 - 12:00
清单2 - 电影1 - 8:00,电影2 - 9:00,电影3 - 13:00
清单3 - 电影1 - 8:00,电影2 - 11:30,电影3 - 12:00

列表顺序无关紧要。

1 个答案:

答案 0 :(得分:0)

你让这比我想象的要复杂得多。如果你从一个放映时间列表开始,那么点击枚举就很简单了。

List<Show> startTimes = GetTimesFromDB();

var moviesGrouped = startTimes.GroupBy(x => x.Name);

foreach(var group in moviesGrouped)
{
    // print times for each movie
}

要使用具体示例,请使用此示例:

List<Sample> sample = new List<Sample>
        {
            new Sample { Id = 1, Time = DateTime.Now },
            new Sample { Id = 1, Time = DateTime.Now.AddDays(1) },
            new Sample { Id = 2, Time = DateTime.Now.AddDays(2) },
            new Sample { Id = 2, Time = DateTime.Now.AddDays(3) },
            new Sample { Id = 3, Time = DateTime.Now.AddDays(4) },
        };

foreach (var group in sample.GroupBy(x => x.Id))
{
    foreach (var element in group)
    {
        Console.WriteLine(element.Id);
        Console.WriteLine(element.Time);
    }
}

您只需按标记分组(在本例中为电影名称),然后枚举分组(将包含您的电影时间)。

但是,您可以通过更改对象模型来大大简化此操作。

public class Movie
{
     public int MovieId { get; set; }
     public string Name { get; set; }
     public List<Showing> Showings { get; set; }
}

public class Showing
{
     public DateTime StartTime { get; set; }
     public List<Seat> UnsoldSeats { get; set; }
     // Etc
}

然后当你有一个List<Movie>时,它已经被设置为进行该显示,它自然比简单的显示类更有意义。

foreach(var movie in movies)
{
    foreach(var showing in movie.Showings)
       // DoStuff
}
相关问题