繁体   English   中英

如何从XML查询Min和Max?

[英]How to query Min and Max from XML?

<?xml version="1.0" encoding="utf-8"?>
<Customers>
   <Customer Id="1">
    <Name>rtertr</Name>
    <DOB>2010-12-12T00:00:00</DOB>
    <EMail>werer@test.com</EMail>
  </Customer>
  <Customer Id="2">
    <Name>west</Name>
    <DOB>0001-01-01T00:00:00</DOB>
    <EMail>west@test.com</EMail>
   </Customer> 
  <Customer Id="3">
    <Name>west</Name>
    <DOB>0001-01-01T00:00:00</DOB>
    <EMail>west@test.com</EMail>
   </Customer> 
</Customers>

如何使用LinQ to XML从上述示例XML中找到Min和Max CustomerId? 例如,对于上述示例,最小值应为1,最大值应为3

var doc = XDocument.Parse(...);

//.ToArray() so we only iterate once
var ids = doc.Root.Elements("Customer").Select(c => (int)c.Attribute("Id")).ToArray();
var minId = ids.Min();
var maxId = ids.Max();

正如dtb的评论所说,这将使数组两次迭代,但仅对xml文档进行一次迭代。 我觉得这是可读性和性能之间的良好折衷-至少在未在生产代码中使用时才如此。 迭代int数组将是xml文档迭代的一小部分。 最好的解决方案是只迭代文档一次,并按照dtb所示跟踪值。

您可以使用MinMax扩展方法:

var doc = XDocument.Parse("<Customers>...</Customers>");

var minId = doc.Root.Elements().Min(e => (int)e.Attribute("Id"));
var maxId = doc.Root.Elements().Max(e => (int)e.Attribute("Id"));

Aggregate扩展方法(仅迭代XML文档一次):

var doc = XDocument.Parse("<Customers>...</Customers>");

var result = doc.Root
                .Elements()
                .Select(e => (int)e.Attribute("Id"))
                .Aggregate(
                    Tuple.Create(int.MinValue, int.MaxValue),
                    (t, x) => Tuple.Create(Math.Max(t.Item1, x),
                                           Math.Min(t.Item2, x)));

var maxId = result.Item1;
var minId = result.Item2;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM