我是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
}
有人可以解释一下如何找到我以前的日期吗?
提前致谢
答案 0 :(得分:2)
我建议使用List<T>.BinarySearch
:找到日期的索引。如果索引为0或更大,则找到确切的日期。如果它是否定的,那么取~index
将获得 插入日期的索引。
获得该信息后,很容易找到上一个索引或下一个索引的值 - 但您应该考虑以下所有情况:
as asides:
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();