LINQ-获取一组元素的最大值
如何使用LINQ查询XML结构并获取属于特定元素的一组元素的最大值 例如,如果XML结构如下所示,我如何获得FullTicket、DayTicket和ChildTicket允许的最大年龄LINQ-获取一组元素的最大值,linq,linq-to-xml,Linq,Linq To Xml,如何使用LINQ查询XML结构并获取属于特定元素的一组元素的最大值 例如,如果XML结构如下所示,我如何获得FullTicket、DayTicket和ChildTicket允许的最大年龄 <TicketTypes> <TicketType Name="FullTicket"> <AgeBands> <AgeBand> <Code>Adult1</Cod
<TicketTypes>
<TicketType Name="FullTicket">
<AgeBands>
<AgeBand>
<Code>Adult1</Code>
<MinAge>18</MinAge>
<MaxAge>59</MaxAge>
</AgeBand>
<AgeBand>
<Code>Adult2</Code>
<MinAge>60</MinAge>
<MaxAge>64</MaxAge>
</AgeBand>
<AgeBand>
<Code>Adult3</Code>
<MinAge>65</MinAge>
<MaxAge>79</MaxAge>
</AgeBand>
</AgeBands>
</TicketType>
<TicketType Name="DayTicket">
<AgeBands>
<AgeBand>
<Code>Adult2</Code>
<MinAge>18</MinAge>
<MaxAge>64</MaxAge>
</AgeBand>
<AgeBand>
<Code>Adult3</Code>
<MinAge>65</MinAge>
<MaxAge>89</MaxAge>
</AgeBand>
</AgeBands>
</TicketType>
<TicketType Name="ChildTicket">
<AgeBands>
<AgeBand>
<Code>Child</Code>
<MinAge>3</MinAge>
<MaxAge>17</MaxAge>
</AgeBand>
<AgeBand>
<Code>Infant</Code>
<MinAge>0</MinAge>
<MaxAge>2</MaxAge>
</AgeBand>
</AgeBands>
</TicketType>
</TicketTypes>
你是说你想要最大值?(事实上这里已经有“max”了,这有点让人困惑。)试着这样做:
// Find the FullTicket element
var fullTicket = ticketTypes.Elements("TicketType")
.Where(x => (string) x.Attribute("Name") == "FullTicket")
.First();
// Find the maximum value of any MaxAge element within FullTicket
var maxFullTicketAge = fullTicket.Descendants("MaxAge")
.Max(x => (int) x);
你也可以对其他类型的票做同样的操作,或者如果你觉得更具冒险精神,你可以做如下操作:
var maxAges = ticketTypes
.Elements("TicketType")
.Select(x => new {
Name = (string) x.Attribute("Name"),
MaxMaxAge = x.Descendants("MaxAge").Max(y => (int) y)
});
我不想这么说Jon,你的代码中有个bug。x、 属性(“名称缺少结束引号”.因为是你,C#编译器会错误地把它捡起来。因此,你需要和Anders谈谈,告诉他C#规范需要重新编写,以便将来可以编译上述内容。嗨,Jon,你更大胆的建议是一个赢家。谢谢。不过我还有一个问题…说“TicketTypes”是属于“Day”元素的元素。因此,您可以有“Saturday”和“Sunday”元素,每个元素都包含一个“TicketTypes”元素,该元素包含多个“TicketType”元素。上面的查询将返回多个票证类型。我如何对您的查询进行分组,以返回整个周末每种票证类型的最大年龄。(即按TicketType分组的MaxAge)。谢谢。@FloatLeft:嗯,恐怕我必须单独考虑一下:)如果您使用相同类型的查询,但使用后代而不是元素(从更高的一级开始),然后添加一个
GroupBy(x=>x.Name)
,那可能就是您所要的。
var maxAges = ticketTypes
.Elements("TicketType")
.Select(x => new {
Name = (string) x.Attribute("Name"),
MaxMaxAge = x.Descendants("MaxAge").Max(y => (int) y)
});