C# 如何返回使用LINQ创建的单个对象?

C# 如何返回使用LINQ创建的单个对象?,c#,xml,linq,linq-to-xml,linq-to-objects,C#,Xml,Linq,Linq To Xml,Linq To Objects,我有一个包含天气预报数据的XML文件。我正试图通过XDocument查询它。我有一个名为“Forecast”的类,我正在尝试创建这种类型的对象,并用LINQ填充其属性,如下所示: public Forecast CurrentConditions(string stateName, string cityName) { var data = from i in weatherResponse.Descendants("current_observation")

我有一个包含天气预报数据的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; }
}
我的“Forecast”类仅包含如下属性:

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突出显示
返回数据并表示
无法将类型“System.Collections.Generic.IEnumerable”隐式转换为“WeatherUnderground1.Forecast”。存在显式转换(是否缺少转换?)

因此,如果我将其更改为:

return (Forecast)data;
我得到异常“未处理的异常:System.NullReferenceException:对象引用未设置为对象的实例”

问题


我做错了什么?返回
Forecast
对象的正确方法是什么?

您的查询没有选择单个预测。如果只需要列表中的第一个,可以使用
FirstOrDefault()


select
返回的是一个
IEnumerable
,换句话说,是一系列then,而不是单个then。如果你确定只有一个,你可以用

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()
来知道返回了多少项,并从中返回。

您的查询将返回一个
IEnumerable
。你要么想退货,要么 您需要将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();
}

请尝试
return data.FirstOrDefault()
使用它来获取值,而不是
TemperatureC=(double)i.Element(“temp_c”)