如何返回使用 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对象的正确方法是什么?

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

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();
}