C# 如何从XML查询最小值和最大值? RTER 2010-12-12T00:00:00 werer@test.com 西 0001-01-01T00:00:00 west@test.com 西 0001-01-01T00:00:00 west@test.com

C# 如何从XML查询最小值和最大值? RTER 2010-12-12T00:00:00 werer@test.com 西 0001-01-01T00:00:00 west@test.com 西 0001-01-01T00:00:00 west@test.com,c#,linq-to-xml,C#,Linq To Xml,如何使用LinQ to XML从上述示例XML中查找最小和最大CustomerId?例如,对于上述样本,最小值应为1,最大值应为3 <?xml version="1.0" encoding="utf-8"?> <Customers> <Customer Id="1"> <Name>rtertr</Name> <DOB>2010-12-12T00:00:00</DOB> <EMa

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

<?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>
正如dtb的评论所说,这将迭代数组两次,但只迭代xml文档一次。我觉得这是可读性和性能之间的一个很好的折衷——至少在生产代码中没有使用它时是这样。迭代int数组将是xml文档迭代的一个小因素。最好的解决方案是只迭代文档一次,并按照dtb显示的方式跟踪值。

您可以使用和扩展方法:

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();
var doc=XDocument.Parse(“…”);
var minId=doc.Root.Elements().Min(e=>(int)e.Attribute(“Id”);
var maxId=doc.Root.Elements().Max(e=>(int)e.Attribute(“Id”);
或扩展方法(仅迭代XML文档一次):

var doc=XDocument.Parse(“…”);
var result=doc.Root
.要素()
.Select(e=>(int)e.Attribute(“Id”))
.合计(
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;

这不会先迭代所有XML节点,然后再迭代两次生成的数组吗?@dtb这是真的。但问题在于你想要什么样的性能,以及它的可读性如何。我认为这是一个很好的折衷方案,因为与迭代文档相比,迭代int数组是一个很小的因素:)我看到你做了一个聚合,它可以跟踪这两个值,这是一个很好的解决方案-但对于新手来说不可读…SQL??首先,将XML导入RDBMS…:-)
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"));
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;