首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >迭代2个嵌套列表

迭代2个嵌套列表
EN

Stack Overflow用户
提问于 2016-08-20 08:02:23
回答 2查看 460关注 0票数 0

我正在编写一个天气应用程序,需要经过两个嵌套循环。对于return值,我想迭代第一个列表,查看相应的第二个列表数据。当第二个列表中的数据与bool匹配时,我需要从对应的第一个列表中获取数据。现在我认为我的代码有效..。但我想问一下,这是否是个好办法。我也不确定这个LINQ查询是否会在一般情况下正常工作,甚至有更多嵌套列表。下面是我在LINQ中的方法:

代码语言:javascript
复制
public static async Task<string> UpdateWeather(string lat, string lon)
{
    WeatherObject weather = await WeatherAPI.GetWeatherAsync(lat, lon);

    var first = (from l in weather.list
                from w in l.weather
                where w.id == 800
                select l.city.name).First();

    return first;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-20 08:36:51

您的代码是好的,它是一个LINQ query.But还有一件事。使用FirstOrDefault()而不是First()。如果没有找到匹配的元素,First()将抛出异常,但FirstOrDefault()将返回元素或默认值。

如果您喜欢这样的话,也可以用LINQ Method syntax编写。

代码语言:javascript
复制
public static async Task<string> UpdateWeather(string lat, string lon)
{
    WeatherObject weather = await WeatherAPI.GetWeatherAsync(lat, lon);

    var first = weather.list.Where(l => l.weather.Any(w => w.id == 800))
                            .Select(l => l.city.name)
                            .FirstOrDefault();

    return first;
}
票数 2
EN

Stack Overflow用户

发布于 2016-08-20 09:03:30

我认为您的查询应该可以工作,而且通常应该使用类似结构的更多嵌套列表。至于这是否是一个很好的方法,它取决于数据结构和任何数据约束。

例如,如果weather.list中的两个元素在嵌套的weather列表中有一个元素可能具有相同的id,那么您的代码将只返回第一个元素--这可能是不正确的。

例如在json中:

代码语言:javascript
复制
[
  {
    city : {
      name : "Chicago"
    },
    weather : [
      {
        id = 799
      },
      {
        id = 800
      }
    ]
  },
  {
    city : {
      name : "New York"
    },
    weather : [
      {
        id = 800
      },
      {
        id = 801
      }
    ]
  }
}

对于此数据集,您的代码将返回"Chicago",但"New York“也匹配。在您正在访问的数据API中,这可能是不可能的,但考虑到没有数据约束来确保嵌套列表的独占性,您可能需要进行防御检查,以确保返回的列表中只有0或1个元素符合预期的标准。

另一项建议

另一方面,这并不是对你问题的严格回答--如果你认为你的代码能工作但不确定,那就编写一个单元测试。在本例中,将对WeatherAPI的调用包装在实现您定义的接口的类中。更新您的方法以在对接口的引用上调用该方法。

对于实际应用程序,请确保在引用上设置了包装器/代理类的实例。

对于单元测试,使用像莫克这样的框架来创建接口的模拟实现,返回一组已知的数据,然后使用它。然后,您可以定义一组单元测试,这些测试使用模拟,这些模拟返回不同的数据结构,并确保代码在所有预期结构下工作。

如果您的类也不是静态方法,并且可以使用依赖注入(尼尼特Autofac或其他许多方法之一),这将容易得多.管理注入服务的适当实现。

对单元测试、依赖注入和模拟的进一步解释将比我在这个答案中所能写的还要多,但我建议阅读它--您将永远不会发现自己又在想“我认为这段代码有效”!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39051894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档