基于属性对XML进行排序和分组

时间:2012-03-19 21:01:41

标签: c# .net sorting attributes linq-to-xml

我在C#中使用LINQ to 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>

我可以使用orderby子句对此xml进行排序,例如

 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;

然后我从查询中获取了一个键列表。

我想要做的是获得所有声明的集合1页,然后所有声明2页等等,但我不知道最大页数是多少。

任何人都可以帮助我吗?

编辑 -

我改变了关于如何实现这一目标的初步想法,我现在希望将其视为类似于此。

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

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

等等。诀窍是我需要查询节点并从中获取多个组。这可以在我的陈述中完成,还是需要一系列陈述?

1 个答案:

答案 0 :(得分: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();