如何使用LINQ返回一个单一的对象?

3

我有一个包含天气预报数据的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;
}

我的“Forecast”类只包含以下属性:

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;

我得到了异常信息“Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object.”。
问题:
我做错了什么?返回Forecast对象的正确方式是什么?

尝试 return data.FirstOrDefault() - L.B
使用以下代码获取数值 TemperatureC = (double)i.Element("temp_c") - Chuck Savage
3个回答

1

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()来知道返回了多少项,然后从那里开始。

0

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

return data.FirstOrDefault();

0

您的查询返回一个 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();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接