【问题标题】:How to return a single object that was created with LINQ?如何返回使用 LINQ 创建的单个对象?
【发布时间】:2014-06-02 14:26:33
【问题描述】:

我有一个包含天气预报数据的 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对象的正确方法是什么?

【问题讨论】:

  • 试试return data.FirstOrDefault()
  • 使用它来获取值而不是TemperatureC = (double)i.Element("temp_c")

标签: c# xml linq linq-to-xml linq-to-objects


【解决方案1】:

select 正在返回一个IEnumerable<Forecast>,换句话说,是一系列 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() 了解退回的商品数量并从那里开始。

【讨论】:

    【解决方案2】:

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

    return data.FirstOrDefault();
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-16
        • 2010-09-28
        • 2015-10-05
        • 1970-01-01
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多