如何解决此for循环冻结我的程序

时间:2019-04-05 08:04:49

标签: c# loops

我的目标是通过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 个答案:

答案 0 :(得分:5)

问题是您的for循环的iterator部分:

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的新实例。您需要将此分配回您的循环变量。相反,++ii++起作用是因为它们实际上会修改i的值。

答案 1 :(得分:1)

无限循环的直接原因是您没有修改 const routing = () => ( <Switch> ... </Switch> ); 变量,应该将day1分配回day1.Adddays(1)

day1

查询数据时(根据您的情况查找丢失的日期),请尝试使用专门为查询而设计的 Linq

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