如何从XML中查询Min和Max?
<?xml version="1.0" encoding="utf-8"?>
<Customers>
<Customer Id="1">
<Name>rtertr</Name>
<DOB>2010-12-12T00:00:00</DOB>
<EMail>[email protected]</EMail>
</Customer>
<Customer Id="2">
<Name>west</Name>
<DOB>0001-01-01T00:00:00</DOB>
<EMail>[email protected]</EMail>
</Customer>
<Customer Id="3">
<Name>west</Name>
<DOB>0001-01-01T00:00:00</DOB>
<EMail>[email protected]</EMail>
</Customer>
</Customers>
如何从使用LINQ to XML在上面的示例XML发现的最小和最大客户ID?例如,对于上面的示例,最小应为1和最大应为3如何从XML中查询Min和Max?
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;
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's评论说,这将迭代阵列两次,但只有XML文档一次。我觉得这是在可读性和性能之间的一个很好的折衷 - 至少当它不用于生产代码时。迭代int数组将成为xml文档迭代的一小部分。最好的解决方案是只迭代一次文档并跟踪dtb显示的路径。
这不会首先迭代所有的XML节点,然后将结果数组迭代两次吗? – dtb 2010-09-30 21:31:12
@dtb的确如此。但是这是一个关于你想要什么样的表现以及它是如何可读的问题。我认为这是一个很好的折衷方案,因为迭代int数组与迭代文档相比是一个小的因素:)我看到你已经做了一个聚合,跟踪这两个值,这是一个很好的解决方案 - 但对新手来说不可读。 .. – 2010-09-30 21:38:26
SQL?那么,首先,将您的XML导入RDBMS ... :-) – Ken 2010-09-30 21:39:37