Как это исправить для цикла заморозил мою программу - PullRequest
0 голосов
/ 05 апреля 2019

Моя цель - зациклить до List<weatherForecast> weatherList и посмотреть, содержит ли оно конкретное значение. Однако каждый раз, когда я запускаю программу, она зависает .

Комментируя разделы цикла, кажется, что все, кроме foreach loop, работает, но я использовал операторы foreach, почти идентичные этому, в других частях программы, и они прекрасно работают.

Boolean flag;

for (DateTime day1 = DateTime.Parse(sDate); day1 <= DateTime.Parse(eDate); day1.AddDays(1))
{
    flag = false;

    foreach (WeatherForecast w in weatherList)
    {
        if (selected.Contains(w.City) && w.getDay().CompareTo(day1) == 0)
        {
            flag = true;
        }
    }

    if (!flag)
    {
        day1 = DateTime.Parse(eDate).AddDays(1);

        MessageBox.Show("Some of the dates in the range you selected do not have weather data. \nDefault data will be used,but you can enter the data manually.", "Missing Data", MessageBoxButton.OK, MessageBoxImage.Warning);
    }
}

Ответы [ 2 ]

5 голосов
/ 05 апреля 2019

Проблема в том, что итератор вашего цикла for:

for (DateTime day1 = DateTime.Parse(sDate); day1 <= DateTime.Parse(eDate); day1.AddDays(1))

Следует читать day1 = day1.AddDays(1);:

for (DateTime day1 = DateTime.Parse(sDate); day1 <= DateTime.Parse(eDate); day1 = day1.AddDays(1))

Это потому, что AddDays не изменяет существующий объект DateTime; он возвращает новый экземпляр DateTime. Вы должны присвоить это обратно вашей переменной цикла. Напротив, ++i или i++ работают, потому что они фактически изменяют значение i.

1 голос
/ 05 апреля 2019

Непосредственной причиной бесконечного цикла является то, что вы не изменяете переменную day1, вам следует присвоить day1.Adddays(1) обратно day1:

for (DateTime day1 = DateTime.Parse(sDate); 
     day1 <= DateTime.Parse(eDate); 
     day1 = day1.AddDays(1))                // <- assign day1.AddDays(1) back to day1
{
  ....
}

Когдазапрашивая данные (в вашем случае ищите пропущенные даты), попробуйте использовать Linq , который был специально разработан для запроса:

  DateTime startDate = DateTime.Parse(sDate).Date;
  DateTime endDate = DateTime.Parse(eDate).Date;

  var missingDates = Enumerable
    .Range(0, (endDate - startDate).Days + 1)
    .Select(day => startDate.AddDays(day))
    .Where(date => !weatherList.Any(w => selected.Contains(w.City) && w.getDate != date))
    .ToArray(); // Let's materialize them as an array

  if (missingDates.Any()) {
    //TODO: we have missingDates, let user know about it
    MessageBox.Show(
      $"You have {missingDates.Length} missing dates",
       "Missing Data", 
        MessageBoxButton.OK, 
        MessageBoxImage.Warning);
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...