Сортировать и группировать XML на основе атрибутов - PullRequest
1 голос
/ 20 марта 2012

Я работаю с LINQ to XML в C #, и мне нужно немного отсортировать атрибуты моих узлов 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>

Я могу отсортировать xml, используя предложение orderby, например

 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 Ответ

3 голосов
/ 20 марта 2012

Вам просто нужно добавить 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();
...