【问题标题】:Take first available item for every year in list获取列表中每年的第一个可用项目
【发布时间】:2018-05-29 13:23:12
【问题描述】:

我有一个日期列表,我想检索每年的第一个现有项目。问题是它并不总是包含一月一日的项目。下面的代码暂时获取所有内容,但如果缺少一天,则不会显示一整年。

foreach (var index in pModel.IndexData)
{
    if (index.Date.ConvertToDateTime().Day == 02 && index.Date.ConvertToDateTime().Month == 01)
         {
            yearlyIndex.Add(index);
         }
}

日期外观示例。

  • 2000-01-01
  • 2000-02-03
  • 2001-03-11...等

我怎样才能总是得到正确的项目?在这个例子中,我总是想得到第 1 行和第 3 行。我可以用一堆 if 语句创建一个循环并添加天数月和年,但我想用 linq 或 lambda 来处理这个问题。

【问题讨论】:

  • 听起来像 orderby 日期和 distinct 年份。
  • 按日期排序。然后按年分组。然后只需选择每个组中的第一项。

标签: c# date time


【解决方案1】:

GroupBy() 年,每年订购并挑选最旧的物品。

List<DateTime> result = input.GroupBy(x => x.Year)
                             .Select(x => x.OrderBy(y => y).First()).ToList();

示例:https://dotnetfiddle.net/As0FBI

【讨论】:

    【解决方案2】:

    如果您想要的只是每年的最短日期列表,则接受的答案是不必要的冗长。只需将OrderBy(y =&gt; y).First().Min() 交换即可更有效地实现相同的结果。

    var result = input.GroupBy(x => x.Year)
                      .Select(x => x.Min()).ToList();
    

    如果日期是列表项类型的属性而不是类型本身,那么只要在 OrderBy 选择器函数中引用了该属性,则可接受的答案就是正确的解决方案。

    【讨论】:

      猜你喜欢
      • 2015-09-22
      • 1970-01-01
      • 2017-11-05
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 2020-09-25
      • 1970-01-01
      • 2014-09-22
      相关资源
      最近更新 更多