2010-09-30 54 views
1
<?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?

+0

SQL?那麼,首先,將您的XML導入RDBMS ... :-) – Ken 2010-09-30 21:39:37

回答

1

您可以使用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; 
2
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顯示的路徑。

+0

這不會首先迭代所有的XML節點,然後將結果數組迭代兩次嗎? – dtb 2010-09-30 21:31:12

+0

@dtb的確如此。但是這是一個關於你想要什麼樣的表現以及它是如何可讀的問題。我認爲這是一個很好的折衷方案,因爲迭代int數組與迭代文檔相比是一個小的因素:)我看到你已經做了一個聚合,跟蹤這兩個值,這是一個很好的解決方案 - 但對新手來說不可讀。 .. – 2010-09-30 21:38:26