С# Разделить список в подсписках на основе значения определенного свойства?

У меня есть список событий, каждый из которых имеет свойство datetime. Мне нужно разделить список на подсписок по годам. Фокус в том, что мой список событий вытаскивается из базы данных и может быть изменен, поэтому я не могу просто указать количество лет и отсортировать события в нужном году. Есть ли способ, чтобы я мог разделить мой основной список событий на подсписки, чтобы в каждом подсписке каждое событие имело тот же год? Таким образом, я получаю подсписок всех событий 2010 года, подсписку всех событий 2011 года и так далее.

Мой список создается следующим образом:

foreach (var ev in eventResults)
    {
        eventsList.Add(new Event()
        {
            Name = ev.Title,
            Month = CultureInfo.CurrentCulture.DateTimeFormat.GetAbbreviatedMonthName(ev.StartDate.Month),
            Day = ev.StartDate.Day,
            Year = ev.StartDate.Year
        });
    }

Ответ 1

Вы должны сделать группировку по годам следующим образом:

eventsList.GroupBy(x => x.Year)

Так что позже вы сможете перебрать результат кода выше:

foreach (var eventsInYear in eventsList.GroupBy(x => x.Year))
{
    // eventsInYear.Key - year
    // eventsInYear - collection of events in that year
}

Ответ 2

Использовать GroupBy:

var eventsByYear = eventsList.GroupBy(a => a.Year);

Затем вы можете перебирать эту коллекцию для обработки каждый год:

foreach (var yearEvents in eventsByYear) 
{
    // yearEvents contains all the events for one particular year
    Console.WriteLine("Events for year: " + yearEvents.Key);
    foreach (var e in yearEvents) 
    {
        Console.WriteLine(e);
    }
}