3个嵌套组与linq

kds*_*253 4 .net c# xml linq-to-xml nested-groups

我正在尝试获得4个List深度列表集合List<List<List<List<int>>>>.从我的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="10505" pages="2"/>
    <Claim key="4" carrier="carB" zip="10505" pages="4"/> 
    <Claim key="5" carrier="carB" zip="10505" pages="4"/>
</root>
Run Code Online (Sandbox Code Playgroud)

输出的结构应该是这样的

-all
   -1
       -34343
           -carA
                   -1

   -2
       -34343
           -carA
                   -2

       -10505
               -carB
                   -3
   -4
       -10505
           -carB
                    -4
                    -5
Run Code Online (Sandbox Code Playgroud)

目标是首先根据节点属性按页数,然后按zip,然后按运营商对XML进行排序.然后,我需要遍历结果列表并按特定顺序处理每个声明.我无法获得3个嵌套组的语法.我已经完成了获得2个嵌套组,任何人都可以帮助我获得第三个.

到目前为止,这是我的代码.

var query = from claim in root.Elements("Claim")
                        group claim by claim.Attributes("Pages").First().Value into pageGroups
                        from zipGroups in
                            (from claim in pageGroups
                             group claim by int.Parse(claim.Attributes("CarrierZip").First().Value))
                        group zipGroups by pageGroups.Key;
Run Code Online (Sandbox Code Playgroud)

abo*_*u00 5

我不知道如何使用XML做到这一点,但如果你已经翻译的债权分为某种类型的数组Claim(例如,在代码中,claims是类型Claim[])和Claim类型有称为属性或字段Key,Carrier,Zip,和Pages这应该工作.

var dic = (from claim in claims
           group claim by claim.Pages into pageGroup
           select new {
               Page = pageGroup.Key,
               Entries =
                   (from zentry in pageGroup
                    group zentry by zentry.Zip into zipGroup
                    select new {
                        Zip = zipGroup.Key,
                        Entries =
                            (from centry in zipGroup
                             group centry by centry.Carrier into carrierGroup
                             select new { Carrier = carrierGroup.Key, Entries = carrierGroup.AsEnumerable() })
                            .ToDictionary(ent => ent.Carrier, ent => ent.Entries)
                    }).ToDictionary(ent => ent.Zip, ent => ent.Entries)
           }).ToDictionary(ent => ent.Page, ent => ent.Entries);
Run Code Online (Sandbox Code Playgroud)

它不是很干净,但它有效.您可以选择具有给定页面,zip和运营商的声明,如下所示:

var myclaim = dic[4][34343]["carB"];
Run Code Online (Sandbox Code Playgroud)

我选择给你一种翻译方式,Dictionary<TKey, TValue>而不是List<T>因为翻译List失去了密钥,所以获取密钥(页面,邮政编码或载体)的唯一方法是遍历列表,这可能会变得丑陋和复杂.对不起,如果词典不适合你.