根据属性对XML进行排序和分组
本文关键字:排序 属性 XML | 更新日期: 2023-09-27 18:28:22
我正在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
等等。诀窍是我需要查询节点并从中获得多个组。这可以在我的语句中完成吗?还是需要一系列语句?
您只需要添加一个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();