2012-03-19 82 views
1

我在C#中使用LINQ to XML,我需要對我的xml節點的屬性進行一些排序。我的xml看起來像這樣。基於屬性對XML進行排序和組合

<root> 
    <Claim key="1" carrier="carA" zip="34343" pages="1"/> 
    <Claim key="2" carrier="carA" zip="34343" pages="2"/> 
    <Claim key="3" carrier="carB" zip="34343" pages="4"/> 
</root> 

我可以使用排序依據條款,如

var query= from claim in root.Elements("Claim") 
      let Key = claim.Attributes("Key").First().Value 
      let Carrier = claim.Attributes("Carrier").First().Value 
      let CarrierZip = int.Parse(claim.Attributes("CarrierZip").First().Value) 
      let Pages = claim.Attributes("Pages").First().Value 
      orderby Pages ascending, CarrierZip ascending, Carrier ascending 
      select claim; 

然後我得到的查詢鍵列表進行排序的XML。

我想要做的是獲得所有與1頁的索賠,然後所有的索賠與2頁等,但我不知道什麼是最大數量的頁面可以。

誰能幫助我嗎?

編輯 -

我改變了對如何做到這一點我INTIAL思想,我現在想的出來把類似於此。

List<List<List<List<int>>>> 

All claims 
- 1 page 
    -zip1 
     -carr1 
     -int claim key 
     -int claim2 key 
     - car2 
    -zip2 
     -car1 
- 2 pages 
    -zip1 

等等。訣竅是我需要查詢節點並從中獲取多個組。這可以在我的陳述中完成嗎?還是需要一系列陳述?

回答

3

你只需要添加一個GroupBy條款:

var query= from claim in root.Elements("Claim") 
      let Key = claim.Attributes("Key").First().Value 
      let Carrier = claim.Attributes("Carrier").First().Value 
      let CarrierZip = int.Parse(claim.Attributes("CarrierZip").First().Value) 
      let Pages = claim.Attributes("Pages").First().Value 
      orderby Pages ascending, CarrierZip ascending, Carrier ascending 
      group new { CarrierZip, Carrier, Key } by Pages; 

foreach (var group in query) 
{ 
    Console.WriteLine("Claims with {0} pages:", group.Key); 
    foreach (var entry in group) 
    { 
     Console.WriteLine(" {0} {1} {2}", entry.CarrierZip, entry.Carrier, 
          entry.Key); 
    } 
} 

編輯:爲了得到這個List<List<int>>,你會使用:

var claims = query.Select(group => group.Select(x => x.Key).ToList()) 
        .ToList(); 

另外,如果你不需要CarrierZip和Carrier在結果中,可以簡化查詢並將其解讀爲:

var query= from claim in root.Elements("Claim") 
      let Key = claim.Attributes("Key").First().Value 
      let Carrier = claim.Attributes("Carrier").First().Value 
      let CarrierZip = int.Parse(claim.Attributes("CarrierZip").First().Value) 
      let Pages = claim.Attributes("Pages").First().Value 
      orderby Pages ascending, CarrierZip ascending, Carrier ascending 
      group Key by Pages; 

var claims = query.Select(group => group.ToList()) 
        .ToList(); 
+0

This works a預計這是偉大的,但我是新來的使用LINQ和我有麻煩,採取團體和使用「鍵」爲每個要求如何我想要的。基本上我想按照正確的順序創建所有鍵的列表,所以在列表中第一個點是按正確順序的1頁索賠的列表,第二個列表是2頁索賠的列表,等等。 – kds6253 2012-03-19 21:26:57

+0

@ kds6253:好的,編輯... – 2012-03-19 21:27:27

+0

我感謝你的幫助。 – kds6253 2012-03-19 21:31:17

相關問題