DateTime转移到下一个预定义日期

Ser*_*gio 5 c# linq datetime

假设我有一个有效的调度日列表.像:23,27,29

我想根据上面的列表将给定日期修改为下一个有效的日期.

如果您的指定日期是"23/11/2013"​​,则下一个有效日期将是"27/11/2013"​​但如果您的指定日期是"2013年11月30日",则必须返回"2013年12月23日"如果给定日期是"30/12/2013"​​,则必须返回"23/01/2014"

我已经在SQL中完成了这个,但现在我正在将它转换为C#,这有点棘手.我正在尝试使用LINQ在列表中进行SQL相似性,但它会让人感到困惑.

SQL语句是(是的,我知道它不会很快):

SELECT TOP 1 @DATE = ISNULL(DateAdd(yy, YEAR(@DATE)-1900, DateAdd(m,  (MONTH(@DATE)+CASE WHEN DATEPART(day,@DATE)>[DAY] THEN 1 ELSE 0 END) - 1, [DAY] - 1)),@DATE)
FROM @DAYS WHERE DateAdd(yy, YEAR(@DATE)-1900, DateAdd(m,  (MONTH(@DATE)+CASE WHEN DATEPART(day,@DATE)>[DAY] THEN 1 ELSE 0 END) - 1, [DAY] - 1))>=@DATE
ORDER BY [DAY]
Run Code Online (Sandbox Code Playgroud)

@DAYS是一张工作台.

Oli*_*ver 2

我认为你正在寻找的是这样的东西(使用 LINQ):

    public static DateTime NextDate(DateTime seed, int[] days)
    {
        if (Enumerable.Range(1, 31).Intersect(days).Any())  //Check to stop a very long running lookup!
        {
            return Enumerable.Range(0, int.MaxValue)
                .Select(i => seed.AddDays(i))
                .First(d => days.Contains(d.Day));
        }

        return seed;
    }
Run Code Online (Sandbox Code Playgroud)

用法:

var nextDate = NextDate(DateTime.Now, new[] { 23, 27, 29 });
Run Code Online (Sandbox Code Playgroud)