我正在编写一个天气应用程序,需要经过两个嵌套循环。对于return值,我想迭代第一个列表,查看相应的第二个列表数据。当第二个列表中的数据与bool匹配时,我需要从对应的第一个列表中获取数据。现在我认为我的代码有效..。但我想问一下,这是否是个好办法。我也不确定这个LINQ查询是否会在一般情况下正常工作,甚至有更多嵌套列表。下面是我在LINQ中的方法:
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;
}发布于 2016-08-20 08:36:51
您的代码是好的,它是一个LINQ query.But还有一件事。使用FirstOrDefault()而不是First()。如果没有找到匹配的元素,First()将抛出异常,但FirstOrDefault()将返回元素或默认值。
如果您喜欢这样的话,也可以用LINQ Method syntax编写。
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;
}发布于 2016-08-20 09:03:30
我认为您的查询应该可以工作,而且通常应该使用类似结构的更多嵌套列表。至于这是否是一个很好的方法,它取决于数据结构和任何数据约束。
例如,如果weather.list中的两个元素在嵌套的weather列表中有一个元素可能具有相同的id,那么您的代码将只返回第一个元素--这可能是不正确的。
例如在json中:
[
{
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或其他许多方法之一),这将容易得多.管理注入服务的适当实现。
对单元测试、依赖注入和模拟的进一步解释将比我在这个答案中所能写的还要多,但我建议阅读它--您将永远不会发现自己又在想“我认为这段代码有效”!
https://stackoverflow.com/questions/39051894
复制相似问题