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

时间:2018-03-01 01:38:15

标签: c# list object uwp nested-loops

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

在这个片段中result是一个对象列表(40个对象,每天8天的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
-

1 个答案:

答案 0 :(得分:2)

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

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

最后日期比较存在问题:

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

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

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