使用Linq-to-XML按地点分组存储平均降雨量至对象列表
问题分析与解决方案
你遇到的问题核心是Linq查询中多套了一层Select,导致返回值类型不匹配。咱们一步步拆解:
错误原因
原代码里的这段逻辑:
AvgRainfall = x.Select(e => e.Elements("rainfall").Average(f => double.Parse(f.Value)))
这里的x是按地点分组后的IGrouping<string, XElement>对象,你用x.Select()会遍历组内的每个datapoint元素,对单个datapoint单独计算降雨量平均,最终返回的是IEnumerable<double>集合——但你的AvgRainfall是double类型,自然会出现类型不匹配的问题。
正确写法
你后来找到的解决方案完全正确,直接对整个分组内的所有rainfall元素求平均即可:
IEnumerable<Datapoint> d = xdoc.Element("weatherdata").Elements("datapoint") .GroupBy(e => e.Element("location").Value) .Select(x => new Datapoint { RegionName = x.Key, AvgRainfall = x.Elements("rainfall").Average(f => double.Parse(f.Value)) });
这里的逻辑很清晰:
- 按地点分组后,每个分组
x包含该地点的所有datapoint元素 x.Elements("rainfall")会提取这个分组里所有datapoint下的rainfall元素- 直接对这些元素解析成
double后求平均,得到的就是该地点的总平均降雨量,类型正好是double,完美匹配AvgRainfall属性。
补充说明
就算某个datapoint下存在多个rainfall元素(你的XML示例里每个只有一个),这个写法依然有效——它会把该地点所有datapoint里的所有rainfall值汇总后求平均,完全符合按地点计算平均降雨量的需求。
内容的提问来源于stack exchange,提问作者Orumiya
相关产品推荐
相关产品推荐

