列出每年的第一个可用项目

时间:2018-05-29 13:23:13

标签: c# date time

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

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

日期的示例。

  • 2000-01-01
  • 2000年2月3日
  • 2001-03-11 ... etc

我怎么能这样做我总是得到正确的项目?在这个例子中,我总是想得到row1和row3。我可以使用一堆if语句创建一个循环并添加几个月和几年但我想用linq或lambda处理这个问题。

2 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:1)

如果您想要的是每年的最短日期列表,则接受的答案是不必要的冗长。通过OrderBy(y => y).First().Min()进行交换,可以更有效地完成相同的结果。

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

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