2

我想从天的列表中获得最近的:

场景一:

Date: July 22, 2013 (Monday)
Possible days: "Tuesday", "Wednesday", "Friday" (string values)
Answer: July 23, 2013 (Tuesday)

场景二:

Date: July 23, 2013 (Tuesday)
Possible days: "Tuesday", "Wednesday", "Thursday", "Saturday"
Answer: July 24, 2013 (Wednesday)

场景 3:

Date: July 24, 2013 (Wednesday)
Possible days: "Monday", "Tuesday"
Answer: July 29, 2013 (Monday)

有什么建议么?

4

6 回答 6

1

像这样 ?

    public DateTime GetNextPossibleDay(DateTime DT, DayOfWeek[] PossibleDays)
    {
        if (PossibleDays.Length == 0)
            throw new Exception("No possible day.");

        do
        {
            DT = DT.AddDays(1);
        }
        while (!PossibleDays.Contains(DT.DayOfWeek));

        return DT;
    }
于 2013-07-22T13:49:36.723 回答
1

您可以检查列表中的每个日期,除非您得到正确的日期,如下所示:

   var days = new List<string> {"Tuesday", "Monday"};
   var startDate = new DateTime(2013, 7, 24).AddDays(1);
   while (!days.Contains(startDate.DayOfWeek.ToString("G")))
   {
        startDate = startDate.AddDays(1);
   }
   Console.WriteLine(startDate);
于 2013-07-22T13:50:48.877 回答
1

这应该有效:

var date = new DateTime(2013, 07, 24);
var posibleDays = new[]{DayOfWeek.Tuesday,DayOfWeek.Wednesday,DayOfWeek.Friday};

var nearestDay = posibleDays.Select(dow => new { 
    DayOfWeek = dow, 
    Diff = (7 + (dow - date.DayOfWeek)) % 7 
})
.Where(x => x.Diff >= 1)
.OrderBy(x => x.Diff)
.FirstOrDefault();

前段时间受到我自己的一个问题的启发。DayOfWeek如果该值早于另一天,则假定一天在下周。

这里是您的示例数据的演示:http: //ideone.com/VzZnzx

于 2013-07-22T13:52:08.863 回答
1

经测试。此代码有效

  List<DayOfWeek> days = new List<DayOfWeek>() { DayOfWeek.Tuesday, DayOfWeek.Wednesday };
        DateTime sourceDate = DateTime.Now;
        DayOfWeek currentDay = sourceDate.DayOfWeek;

        int? smallestValue = null;

        foreach (DayOfWeek d in days)
        {
            int currentValue = (int)d - (int)currentDay;
            if (!smallestValue.HasValue)
                smallestValue = currentValue;

            if(smallestValue > currentValue)
                smallestValue = currentValue;

        }

        DateTime nearestDate = sourceDate.AddDays(smallestValue.Value);
于 2013-07-22T13:54:37.260 回答
1

不是一个花哨的 Linq,但这有效 =)

    public static DateTime NearestDate(DateTime baseDateTime, List<string> acceptedDays)
    {
        DateTime result = new DateTime(baseDateTime.Year, baseDateTime.Month, baseDateTime.Day);

        List<DayOfWeek> acceptedDoW = new List<DayOfWeek>();
        acceptedDays.ForEach(x => acceptedDoW.Add((DayOfWeek)Enum.Parse(typeof(DayOfWeek), x, true)));

        DayOfWeek currentDay = baseDateTime.DayOfWeek;

        int closestDay = int.MaxValue;

        acceptedDoW.ForEach(x =>
            {
                int currentSpan = (int)x;

                if (x < currentDay)
                    currentSpan += 7;

                currentSpan = currentSpan - (int)currentDay;

                if (currentSpan < closestDay)
                    closestDay = currentSpan;
            });

        return result.AddDays(closestDay);
    }
于 2013-07-22T13:58:30.157 回答
1
DateTime date = DateTime.Parse("July 22, 2013");
        DayOfWeek dateDay = date.DayOfWeek;
        DayOfWeek[] possibleDays = { DayOfWeek.Tuesday,DayOfWeek.Wednesday,DayOfWeek.Friday };
        int addToBestAnswer = 7;
        foreach (var checkDay in possibleDays)
        {
            if (checkDay-dateDay<addToBestAnswer)
            {
                addToBestAnswer = checkDay - dateDay;
            }
        }
        DateTime Answer = date.AddDays(addToBestAnswer);

编辑:仅用于字符串输入:

DateTime date = DateTime.Parse("July 22, 2013");
        string[] possibleDays={ "Tuesday","Wednesday","Friday" };

        List<int> pDays = new List<int>();
        foreach (var inputDay in possibleDays)
        {
            pDays.Add(int.Parse(inputDay.Replace("Sunday", "0").Replace("Monday", "1").Replace("Tuesday", "2").Replace("Wednesday", "3").Replace("Thursday", "4").Replace("Friday", "5").Replace("Saturday", "6")));
        }
        int dateDay = (int)date.DayOfWeek;

        int addToBestAnswer = 7;
        foreach (var checkDay in pDays)
        {
            int difference = checkDay - dateDay;
            if (difference<0)
            {
                difference = 7 + difference;
            }
            if (difference<addToBestAnswer&&difference!=0)
            {
                addToBestAnswer = difference;
            }
        }
        DateTime Answer = date.AddDays(addToBestAnswer);
        // Answer.ToShortDateString()+" ("+Answer.DayOfWeek.ToString()+")";
于 2013-07-22T14:11:27.277 回答