【问题标题】:Saving data from Linq-to-XML with groupBy to object List使用 groupBy 将数据从 Linq-to-XML 保存到对象列表
【发布时间】:2018-05-12 11:15:20
【问题描述】:

我有一个具有这种结构的 XML:

<weatherdata>
    <datapoint>
        <location>London</location>
        <rainfall>14</rainfall>
    </datapoint>
......
</weatherdata>

我想将按位置分组的平均降雨量保存到数据点对象列表中。 Datapoint 对象具有 Location 和 AvgRainfall 属性。

List<Datapoint> datapointList = new List<Datapoint>();
var q = xdoc.Element("weatherdata").Elements("datapoint")
       .GroupBy(e => e.Element("location").Value);

IEnumerable<Datapoint> d = xdoc.Element("weatherdata").Elements("datapoint")
  .GroupBy(e => e.Element("location").Value)
  .Select(x => new Datapoint
   {
      RegionName = x.Key,
      AvgRainfall = x.Select(e => e.Elements("rainfall")
                 .Average(f => double.Parse(f.Value)))
   });

问题是,AvgRainfall 属性是双精度的,但 x.Select 返回一个 IEnumerable - 双精度列表。 请指出正确的方向。

编辑:这个解决方案对我的问题很有效:

AvgRainfall = x.Elements("rainfall").Average(f => double.Parse(f.Value)) 

【问题讨论】:

    标签: c# group-by linq-to-xml average


    【解决方案1】:

    试试这个:

    AvgRainfall = x.SelectMany(e => e.Elements("rainfall").Select(f => f.value))
                 .Average(g => double.Parse(g))
    

    SelectMany 从多个集合返回特定元素的列表。

    【讨论】:

    • 问题是,我想要一个双精度变量,但我得到了整个平均值列表。
    • @Orumiya 已更新。我认为应该在收集所有降雨值时调用 Average 方法。
    • 将 .First() 添加到查询末尾以获得单数。
    • @jdweng with .First() 不幸的是,它只返回列表中的第一个元素并且没有计算平均值 --> AvgRainfall = x.Select(e => e.Elements("rainfall" ).Average(f => double.Parse(f.Value))).First()
    • @daniell89 谢谢,AvgRainfall = x.Elements("rainfall").Average(f => double.Parse(f.Value)) 效果很好
    猜你喜欢
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    相关资源
    最近更新 更多