从特定的日期列表中查找日期

时间:2017-05-04 08:39:50

标签: c# date

我是c#的初学者,我无法找到解决问题的方法。

我正在创建一个允许我发送提醒的个人项目,我有一个日期列表,我需要在现实生活中的两个特定日期之间完成任务。

我找到了如何从今天开始的下一个日期,但我无法找到如何获得前一个日期

这是我的示例代码

void calc_x_date()  
    {
        List<string> x_dates = new List<string>();
        x_dates.Add("10/01/2017");
        x_dates.Add("14/02/2017");
        x_dates.Add("14/03/2017");
        x_dates.Add("11/04/2017");
        x_dates.Add("09/05/2017");
        x_dates.Add("13/06/2017");
        x_dates.Add("04/07/2017");
        x_dates.Add("08/08/2017");
        x_dates.Add("12/09/2017");
        x_dates.Add("10/10/2017");
        x_dates.Add("14/11/2017");
        x_dates.Add("12/12/2017");

        var allDates = x_dates.Select(DateTime.Parse).OrderBy(d => d).ToList();

        var todayDate = DateTime.Today;
        var nextDate = todayDate >= allDates.Last()
             ? allDates.Last()
             : todayDate <= allDates.First()
                 ? allDates.First()
                 : allDates.First(d => d >= todayDate);

       string NextDate = nextDate.ToString(); // the closest next date from today          
       //string PreviousDate =   // the closest previous date from today   
    }

有人可以解释一下如何找到我以前的日期吗?

提前致谢

3 个答案:

答案 0 :(得分:2)

我建议使用List<T>.BinarySearch:找到日期的索引。如果索引为0或更大,则找到确切的日期。如果它是否定的,那么取~index将获得 插入日期的索引。

获得该信息后,很容易找到上一个索引或下一个索引的值 - 但您应该考虑以下所有情况:

  • 今天是在所有日期之前
  • 今天是所有日期
  • 今天是列表中第一个和最后一个日期之间的日期,但不在列表中
  • 今天等于第一个日期
  • 今天等于上次日期
  • 今天等于列表中的日期不是第一个或最后一个日期

as asides:

  • 我强烈建议您尽快遵循.NET命名约定的习惯
  • 除非您确实需要
  • ,否则我建议您不要使用字符串来表示日期
  • 如果您正在进行大量的日期/时间工作,您可能会发现我的Noda Time库比DateTime
  • 更容易使用

答案 1 :(得分:0)

以字符串格式存储日期有效。然而,进行日期比较非常困难。您必须先将其强制转换为数字,处理异常等等。

C#有一个DateTime对象。您可以在此存储日期并忽略时间。可以使用&lt;来比较DateTime对象。和&gt;运算符。

如果您创建一个包含开始日期和结束日期的类,请将这些对象存储在一个(任务列表)列表中,这样可以解决您的问题吗?您还可以将字符串中的任务文本添加到所述对象中。

答案 2 :(得分:0)

这是Linq方法

List<string> x_dates = new List<string>();
x_dates.Add("10/01/2017");
x_dates.Add("14/02/2017");
x_dates.Add("14/03/2017");
x_dates.Add("11/04/2017");
x_dates.Add("09/05/2017");
x_dates.Add("13/06/2017");
x_dates.Add("04/07/2017");
x_dates.Add("08/08/2017");
x_dates.Add("12/09/2017");
x_dates.Add("10/10/2017");
x_dates.Add("14/11/2017");
x_dates.Add("12/12/2017");


DateTime today = DateTime.Today;
IEnumerable<DateTime> dt_dates = x_dates.Select(DateTime.Parse);

DateTime prev = dt_dates.Where(x => x < today)
                        .OrderByDescending(x => x)
                        .First();

DateTime next = dt_dates.Where(x => x > today)
                        .OrderBy(x => x)
                        .First();

替代解决方案

DateTime prev = dt_dates.Where(x => x < today).Max();
DateTime next = dt_dates.Where(x => x > today).Min();