我正在创建一个存储和显示天气详情的应用程序。
在这个片段中,result
是一个对象列表(40个对象,每天超过5天的8个天气预报),我将其分为几天和几小时。我使用嵌套列表在一个列表中显示每小时预测列表(每个sortedDay
列表中都有自己的sortedHours
列表。
当我打印输出时,每个对象具有相同的值,并且在每次打印后调用Debug.WriteLine(" -");
(当它应该被称为最多5次时被调用39次)
//create a list of weatherController lists to hold each day
List<List<WeatherController>> sortedDays =new List<List<WeatherController>>();
//create a list of weatherController objects to hold each hourly interval
List<WeatherController> sortedHours = new List<WeatherController>();
// a base time
DateTime prevDate = Convert.ToDateTime("2000-01-01");
int counter = 0;
// iterate through result list
foreach (var wCount in result.list)
{
// if the date is greater than the previous date add the sortedHours to sortedDays
if (Convert.ToDateTime(result.list[counter].dt_txt) > prevDate && counter!=0)
{
sortedDays.Add(sortedHours);
sortedHours.Clear();
}
WeatherController wController= new WeatherController();
wController.dtime=result.list[counter].dt_txt;
wController.temp = result.list[counter].main.temp;
wController.humidity= result.list[counter].main.humidity;
wController.desc = result.list[counter].weather[0].description;
wController.windSpeed= result.list[counter].wind.speed;
sortedHours.Add(wController);
prevDate = Convert.ToDateTime(result.list[counter].dt_txt);
counter++;
}
// test List of list Structure
int xCount=0,yCount=0;
foreach(var sd in sortedDays)
{
foreach(var sh in sortedHours)
{
// DEBUG
Debug.WriteLine(sortedDays[xCount][yCount].ToString());
yCount++;
}
Debug.WriteLine(" -");
xCount++;
yCount = 0;
}
输出的片段:
dtime:2018-03-05 21:00:00 temp:274.687 humidity:100 desc:light rain windpeed:3.61
-
dtime:2018-03-05 21:00:00 temp:274.687 humidity:100 desc:light rain windpeed:3.61
-
dtime:2018-03-05 21:00:00 temp:274.687 humidity:100 desc:light rain windpeed:3.61
-
dtime:2018-03-05 21:00:00 temp:274.687 humidity:100 desc:light rain windpeed:3.61
-
第一个问题是您正在为每个结果条目重用一个sortedHours
实例。因为List<T>
是引用类型,所以变量指向存储数据的内存中的位置。因为你在每次迭代中将Clear
和Add
放到同一个实例中,所以在最后一次“round”之后它将只包含列表中的最后一项。
第二个问题是输入中的最后一项未被处理,因为foreach
将结束,而sortedHours
列表将包含一些尚未分配给任何一天的项目。
最后在日期比较中存在问题:
Convert.ToDateTime(result.list[counter].dt_txt) > prevDate
这不仅仅是比较日期。它比较日期和时间。这意味着每次都会执行if。要仅比较日期,您必须使日期的时间部分无效,这可以通过使用Date
属性最容易地完成:
Convert.ToDateTime(result.list[counter].dt_txt).Date > prevDate.Date