2012-03-19 83 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

相关问题