【问题标题】:Split list into sublists based on a value of a certain property?C# 根据某个属性的值将列表拆分为子列表?
【发布时间】:2014-12-10 13:58:26
【问题描述】:

我有一个事件列表,每个事件都有一个 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
        });
    }

【问题讨论】:

标签: c# list


【解决方案1】:

您需要像这样创建grouping by 年份:

eventsList.GroupBy(x => x.Year)

所以稍后您将能够遍历上面代码的结果:

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

【讨论】:

  • 这非常有用。刚刚又爱上了 C#。
  • 分组后,你将如何根据年份制作单独的列表?
  • @KenGordon GroupBy 返回IEnumerable<IGrouping<TKey,TSource>>,因为IGrouping 实现IEnumerable,您可以简单地在每个单独的项目上调用ToList。但是我不太明白您为什么需要它,IGrouping 的目的是提供对分组键(年份)的引用。如果您不喜欢IGrouping,您可以将其重组为IDictionary。如果您在foreach 循环之外声明var dict = new Dictionary<int, IList<Event>>();,则可以通过调用dict.Add(eventsInYear.Key, eventsInYear.ToList()); 来填充它
  • @Vladimirs 这对我来说有点新鲜,我想看看如何将列表的各个部分分成单独的列表,例如,如果您想要包含三年的 3 个列表。这更有意义吗?
  • @Ken 给你var year2000 = eventsList.GroupBy(x => x.Year).FirstOrDefault(x => x.Key == 2000).ToList(); var year2001 = eventsList.GroupBy(x => x.Year).FirstOrDefault(x => x.Key == 2001).ToList(); var year2002 = eventsList.GroupBy(x => x.Year).FirstOrDefault(x => x.Key == 2002).ToList();
【解决方案2】:

使用分组方式:

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);
    }
}

【讨论】:

  • btw event 是关键字,不能马上使用,应该是@event
  • @Vladimirs:很好的收获。
猜你喜欢
  • 1970-01-01
  • 2021-05-18
  • 2023-04-11
  • 2015-05-13
  • 2014-07-07
  • 2015-12-13
  • 2018-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多