如何返回使用 LINQ 创建的单个对象
本文关键字:创建 LINQ 单个 对象 何返回 返回 | 更新日期: 2023-09-27 18:06:10
我有一个包含天气预报数据的XML文件。我正在尝试通过XDocument查询它。我有一个名为"Forecast"的类,我正在尝试创建这种类型的对象并使用 LINQ 填充其属性,如下所示:
public Forecast CurrentConditions(string stateName, string cityName)
{
var data = from i in weatherResponse.Descendants("current_observation")
select new Forecast
{
TemperatureC = Convert.ToDouble(i.Element("temp_c").Value)
//Setting other properties here
};
return data;
}
我的"预测"类仅包含如下属性:
class Forecast
{
public double TemperatureF { get; set; }
public double TemperatureC { get; set; }
public string RelativeHumidity { get; set; }
}
然而,VS强调了return data;
并说"Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<WeatherUnderground1.Forecast>' to 'WeatherUnderground1.Forecast'. An explicit conversion exists (are you missing a cast?)"
因此,如果我将其更改为:
return (Forecast)data;
我收到异常"未处理的异常:System.NullReferenceException:对象引用未设置为对象的实例"。
问题
我做错了什么,返回Forecast
对象的正确方法是什么?
select
返回一个IEnumerable<Forecast>
,换句话说,是一系列然后,而不是一个。如果您确定只有一个,则可以使用,
public Forecast CurrentConditions(string stateName, string cityName)
{
var datas = from i in weatherResponse.Descendants("current_observation")
select new Forecast
{
TemperatureC = Convert.ToDouble(i.Element("temp_c").Value)
//Setting other properties here
};
return datas.SingleOrDefault(); // Or FirstOrDefault() or LastOrDefault()
}
但是,如果有多个预测,这将返回null
;这可能是您想要的,以防您需要在几个预测中做某种平均值。您可以使用datas.Count()
来了解退回了多少物品并从那里开始。
您的查询未选择单个预测。如果您只想要列表中的第一个,您可以使用FirstOrDefault()
:
return data.FirstOrDefault();
您的查询返回一个IEnumerable<Forecast>
。您要么想要返回它,要么您需要将 FirstOrDefault(( 或 SingleOrDefault(( 附加到查询中以返回单个项目。
public Forecast CurrentConditions(string stateName, string cityName)
{
var data = from i in weatherResponse.Descendants("current_observation")
select new Forecast
{
TemperatureC = Convert.ToDouble(i.Element("temp_c").Value)
//Setting other properties here
};
//change this: return data;
//to:
return data.FirstOrDefault();
//or (if you know for certain there can be no more than 1 item):
return data.SingleOrDefault();
}