C#UWP填充和访问嵌套列表

问题描述 投票:0回答:1

我正在创建一个存储和显示天气详情的应用程序。

在这个片段中,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
-
c# list object uwp nested-loops
1个回答
2
投票

第一个问题是您正在为每个结果条目重用一个sortedHours实例。因为List<T>是引用类型,所以变量指向存储数据的内存中的位置。因为你在每次迭代中将ClearAdd放到同一个实例中,所以在最后一次“round”之后它将只包含列表中的最后一项。

第二个问题是输入中的最后一项未被处理,因为foreach将结束,而sortedHours列表将包含一些尚未分配给任何一天的项目。

最后在日期比较中存在问题:

Convert.ToDateTime(result.list[counter].dt_txt) > prevDate

这不仅仅是比较日期。它比较日期和时间。这意味着每次都会执行if。要仅比较日期,您必须使日期的时间部分无效,这可以通过使用Date属性最容易地完成:

Convert.ToDateTime(result.list[counter].dt_txt).Date > prevDate.Date
© www.soinside.com 2019 - 2024. All rights reserved.