代码之家  ›  专栏  ›  技术社区  ›  MidnightP

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

  •  0
  • MidnightP  · 技术社区  · 6 年前

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

    在此代码段中 result 是一个对象列表(40个对象,5天内每天8个天气预报),我将其分为几天和几小时。我正在使用嵌套列表显示一个天数列表中的每小时预测列表(每个 sortedDay 列表有自己的 sortedHours 在其中列出。

    当我打印输出时,每个对象都有相同的值 Debug.WriteLine(" -"); 每次打印后调用(39次,最多只能调用5次)

    //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 回复  |  直到 6 年前
        1
  •  2
  •   Martin Zikmund    6 年前

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

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

    最后,数据比较中存在问题:

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

    确实如此 不仅比较日期 . 它比较 日期和时间 . 这意味着每次都会执行if。要仅比较日期,必须将日期的时间部分置零,这可以通过使用 Date 属性:

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