0

日付ごとにグループ化したいイベントのリストがありますが、一部のイベントは同じ日付を共有しているため、時間ごとにもグループ化します。たとえば、次のイベントがあるとします。

Event 1 - 10/23/2013 2:30:00 PM
Event 2 - 10/24/2013 2:30:00 PM
Event 3 - 10/25/2013 2:30:00 PM
Event 3 - 10/25/2013 6:30:00 PM

イベント 3 は、同じ日に 2 つの上映がありますが、時間は異なります。理想的には、結果が次のようになる新しいリストを反復処理したいと思います。

10/23/2013               10/24/2013               10/25/2013
Name: Event 1            Name: Event 2            Name: Event 3
Time: 2:30 PM            Time: 2:30 PM            Time: 2:30 PM & 6:30 PM

私は新しいリストを作成し、イベントを時間ごとにグループ化し、時間のサブリストを作成しようとしています。これまでのコードの一部を次に示しますが、「CS1001: 識別子が必要です」というエラーが表示されます

List<dynamic> Events = new List<dynamic>();
var grouped = from e in Events
    group e by e.Starts into g
                select new
                {
                    Name = g.First().Name,
                    Starts = g.First().Starts,
                    StartTimes = (from g.First().Starts
                        group d by g.Starts.ToString("hh:mm")
                    )
                };

どうすれば意図した結果を達成できるか考えていますか?

4

2 に答える 2

2

You could use a nested GroupBy:

query:

var groups = events
.GroupBy(ev => ev.Starts.Date)
.Select(dateGroup => new
{
    DateGroup = new { Date = dateGroup.Key, Events = dateGroup.ToList() },
    ListOfTimeGroup = dateGroup
        .GroupBy(dg => dg.Starts.TimeOfDay)
        .ToList()
}).ToList();

foreach (var group in groups)
{
    DateTime date = group.DateGroup.Date;
    List<Event> dateEvents = group.DateGroup.Events;
    Console.WriteLine(string.Join(",", dateEvents));
    foreach( var timeGroup in group.ListOfTimeGroup)
    {
        TimeSpan timeOfday = timeGroup.Key;
        List<Event> timeEventList = timeGroup.ToList();
        Console.WriteLine(string.Join(",", timeEventList));
    }
}

sample data:

var events = new List<Event>(){
    new Event{Name="Event 1", Starts=new DateTime(2013,10,23, 14, 30, 00)},
    new Event{Name="Event 2", Starts=new DateTime(2013,10,24, 14, 30, 00)},
    new Event{Name="Event 3", Starts=new DateTime(2013,10,25, 14, 30, 00)},
    new Event{Name="Event 4", Starts=new DateTime(2013,10,25, 18, 30, 00)}

};

class used:

public class Event
{
    public string Name { get; set; }
    public DateTime Starts { get; set; }
    public override string ToString()
    {
        return Name + " " + Starts.ToString();
    }
}

output:

Event 1 23.10.2013 14:30:00
   Event 1 23.10.2013 14:30:00
Event 2 24.10.2013 14:30:00
   Event 2 24.10.2013 14:30:00
Event 3 25.10.2013 14:30:00, Event 4 25.10.2013 18:30:00
   Event 3 25.10.2013 14:30:00
   Event 4 25.10.2013 18:30:00
于 2013-09-27T10:03:05.977 に答える
1

これが私がそれを行う方法です:

var grouped =
    from e in events
    group e by e.Starts.Date into g
    let first = g.First()
    select new
    {
        Date = g.Key,
        Events = from e in g
                group e by e.Name into g2
                select new
                {
                    Name = g2.Key,
                    Time = string.Join(", ", g2.Select(e2 => e2.Starts.ToString("t")))
                }
    };

foreach (var day in grouped)
{
    Console.WriteLine ("{0:d}", day.Date);
    foreach (var e in day.Events)
    {
        Console.WriteLine (e.Name);
        Console.WriteLine ("Time: " + e.Time);
    }
    Console.WriteLine ();
}
于 2013-09-27T10:01:28.537 に答える