【问题标题】:Filter a List of Dates by Day Number按天数过滤日期列表
【发布时间】:2013-05-29 18:09:29
【问题描述】:

我正在尝试按天数过滤日历(日期列表),但正在为特定场景而苦苦挣扎!

日历最初将包含指定范围内的所有日期,例如 2013 年 1 月 31 日 - 2015 年 1 月 31 日。我想过滤此列表以仅包含与日历中第一天数匹配的日期,例如,如果日历中的第一天是 25,返回的新过滤日历将是:

  • 2013 年 2 月 25 日
  • 2013 年 3 月 25 日
  • 2013 年 4 月 25 日

...等

第一个示例使用 LINQ 非常简单

var calendar = ...code to get calendar from DB.

//Get Day Number of First Entry in Calendar (31st for example)
int day = calendar.Dates.Select(d => d.Date.Day).First();

//Filter the rest of the calendar by this date.
return new Calendar
{
    Dates = calendar.Dates.Where(c => c.Date.Day == day).ToList()
};

我在传入时遇到困难,比如 31。我的要求是返回:

  • 2013 年 1 月 31 日
  • 2013 年 2 月 28 日
  • 2013 年 4 月 30 日
  • 2013 年 5 月 31 日

...等

实现这一目标的最佳方法是什么?它在星期三早上啄我的大脑!

如果可能的话,我希望答案是一个完美的单行 LINQ 语句:)

非常感谢,

亚历克斯

【问题讨论】:

  • 您能提供将使用的年份吗?
  • 所以你真的不希望日期是31,而是任何一个月的最后一天?也许这种方法会有所帮助:bool IsLastOfMonth(DateTime date) { return date == new DateTime(date.Year, date.Month, 1).AddMonths(1).AddDays(-1); }(未测试)
  • 预过滤的日历很可能包含一个跨度为 3-5 年的日期范围,例如 2012 年至 2015 年,所有日期都介于两者之间。这能回答你的问题吗?
  • 不是真的,但我忘记了 DateTime.Year。接听来电!
  • @Corak - 是的,谢谢,也许这个和原始代码的组合可能会起作用。我看看能不能把东西捣碎。

标签: c# linq datetime calendar


【解决方案1】:

DateTime.DaysInMonth 来救援!

return new Calendar
{
Dates = calendar.Dates.Where(c => c.Date.Day == Math.Min(day, DateTime.DaysInMonth(c.Year, c.Month))).ToList()
};

【讨论】:

    【解决方案2】:
    Dates = calendar.Dates.Where(c => c.Date.Day == Math.Min(day, DateTime.DaysInMonth(c.Year, c.Month))).ToList()
    

    【讨论】:

    • 他得到一天,然后他要么得到那个数字的日子,要么得到这个月最后一天的数字太大。快到了,但不完全是。 -1.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多