2015-12-18 3 views
2

Я пытался выяснить, как сделать следующий доступный день на основе настоящего дня, т.е. если сегодня пятница, затем выполните поиск в Массив в течение ближайшего ближайшего дня, например, если значения Array 1 [понедельник], 2 [вторник], 4 [четверг], 6 [суббота], тогда мой следующий день должен быть в субботу.Найти следующий доступный день в массиве строки

Вот что я пытался

//Here i'll get days like 0, 2, 3, 4, 6 pattern, and i'm spliting them based on comma to get single-single day value in array of string 
string[] GetDays = DayInWeek.Split(','); [Here day patterns will change everytime, based on user selection] 

//Here i'm looping to take each day and get Enum Text based on Enum Value 
foreach (string FirstDay in GetDays) 
{ 
    //Here i'm converting the string value into int and passing to DayOfWeek Enum to get respective day 
    DayOfWeek DayChoosen = ((DayOfWeek)(Convert.ToInt32(FirstDay))); 

    //Here i have my actual day for example Friday 
    DayOfWeek StartDay = "Friday"; 

    //Here i need condition to find next available day in the foreach i.e., after Friday next value should be Saturday, or Sunday, Monday & so on until Friday==Friday 
    if (StartDay == DayChoosen) 
    { 
     //End foreach 
    } 
} 

Как я уже говорил на основе сегодняшнего дня я должен найти следующий доступный день то есть, если в пятницу я должен искать в субботу, если суббота не существует, то воскресенье, понедельник и так до пятницы = в пятницу

ответ

2

Вам не нужны все эти манипуляции с foreach.

Вы можете сделать следующее:

private int nextDay(string dayInWeek, int startDay) 
{ 
    int[] getDays = dayInWeek.Split(',').Select(int.Parse).ToArray(); 

    return getDays.Where(d => d > startDay).Any() 
     ? getDays.Where(d => d > startDay).Min() 
     : getDays.Min(); 
} 

Этот алгоритм проверяет, есть ли какие-либо дни недели, которые представлены в вашем массиве, и прийти после startDay. В противном случае он выдает первый доступный день через неделю.

Например, для строки "0, 2, 3, 4, 6":

  • для startDay 0 - выход 2, так как это минимальное целое число, которое больше чем 0
  • для startDay 1 - выходы 2
  • для startDay 3 - выход 4
  • для startDay-он не находит предметов, которые более, чем 6, и выходов минимума 0

В строке "5" (пятница только):

  • для startDay 5, 6 - не находит предметы, которые более чем 5, выходной минимум (5)
  • для startDay 0-4 - выходы 5, в качестве минимального числа, которое больше 0-4
+0

Есть ли способ, что я могу сортировать getDays массив на основе значения startDay т.е. предположим, что getDays = [1,3,4,6] и startDay = 3, то getDays следует изменить, как [3,4,6,1] ... – Amar

+0

@Rajesh Это еще один вопрос :) Вы можете отсортировать массив, найти индекс своего значения и сменить массив. Эта статья может быть полезна: http://stackoverflow.com/questions/1470982/how-to-shift-the-start-of-an-array-in-c –

+0

Эквивалентный способ, при котором «источник» повторяется только один раз , является 'return getDays.OrderByDescending (d => d> startDay) .ThenBy (d => d) .First();'. Сначала заказываются дни, когда они превышают «startDay» или нет («false» меньше «true», поэтому используйте Descending), а затем самим целым. Может быть, это труднее читать, хотя и более прохладно. В этом случае вы можете отказаться от '.ToArray()'. –

0

Попробуйте это;

//Here i'll get days like 0, 2, 3, 4, 6 pattern, and i'm splitting them based on comma to get single-single day value in array of string 
    string DayInWeek = "0, 2, 3, 4, 6"; 
    string[] GetDays = DayInWeek.Split(','); //[Here day patterns will change everytime, based on user selection] 

    DayOfWeek nextAvailableDay; 

    //Here i'm looping to take each day and get Enum Text based on Enum Value 
    foreach (string FirstDay in GetDays) 
    { 
     //Here i'm converting the string value into int and passing to DayOfWeek Enum to get respective day 
     DayOfWeek DayChoosen = ((DayOfWeek)(Convert.ToInt32(FirstDay))); 

     //Here i have my actual day for example Friday 
     DayOfWeek StartDay = DayOfWeek.Friday; 

     //Here i need condition to find next available day in the foreach i.e., after Friday next value should be Saturday, or Sunday, Monday & so on until Friday==Friday 
     if (StartDay.Equals(DayChoosen)) 
         break; 

     if (StartDay < DayChoosen) 
     { 
      nextAvailableDay = DayChoosen; 
      break; 
     } 
     continue; 
    } 
0

Вам следует сыграть в списке int. Я предоставлю вам псевдокод.

Алгоритм:

  1. сортировать список доступных
  2. получить все большее число (больше, чем ваш текущий) из списка
    1. выбрать минимум сейчас, и перерыв
  3. Если у вас нет большего количества, выберите все минимальные числа (меньше, чем ваш cur Сдать)
    1. выберите максимум из этого списка сейчас, и перерыв
  4. , если у вас нет каких-либо больше или меньше числа, чем выбрать один и тот же номер и разорвать
  5. Теперь преобразовать число в недельный день

Это возможный алгоритм, который я решил решить эту проблему. Вы можете преобразовать его в код. Может быть, это не самый лучший, но я уверен, что он будет работать нормально.

0

проверить это:

Console.WriteLine("Kindly provide input"); 
      string DayInWeek = Console.ReadLine(); 
      string[] GetDays = DayInWeek.Split(','); 
      Array.Sort(GetDays); 
      DateTime dt = DateTime.Today; 
      int i = (int)dt.DayOfWeek; 
      Console.WriteLine("Today is " + (DayOfWeek)i); 
      bool flag = false; 
      foreach (string FirstDay in GetDays) 
      { 
       if (Convert.ToInt32(FirstDay) > i) 
       { 
        Console.WriteLine((DayOfWeek)Convert.ToInt32(FirstDay) + " is the next day"); 
        flag = true; 
        break; 
       } 
      } 
      if (!flag) 
      { 
       Console.WriteLine((DayOfWeek)Convert.ToInt32(GetDays[0]) + " is the next day"); 
      } 
      Console.ReadKey(); 
Смежные вопросы