c# - 3个带linq的嵌套组

标签 c# .net xml linq-to-xml nested-groups

我正在尝试获取 4 个列表深度列表集合,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>

输出的结构应该是这样的

-all
   -1
       -34343
           -carA
                   -1

   -2
       -34343
           -carA
                   -2

       -10505
               -carB
                   -3
   -4
       -10505
           -carB
                    -4
                    -5

目标是根据节点属性首先按页数对我的 XML 进行排序,然后按 zip,然后按承运人。然后我需要循环浏览结果列表并按特定顺序处理每个 claim 。我无法为 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;

最佳答案

我不确定如何使用 XML 执行此操作,但是如果您已经将声明转换为某种类型的数组 Claim (例如,在代码中,claimsClaim[] 类型)和 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);

它不是很干净,但是可以用。您可以选择具有给定页面、 zip 和承运人的声明,如下所示:

var myclaim = dic[4][34343]["carB"];

我选择给你一个翻译成Dictionary<TKey, TValue>的方法而不是 List<T>因为翻译成 List丢失了 key ,因此获取 key (页面、 zip 或载体)的唯一方法是向下遍历列表,这可能会变得丑陋和复杂。抱歉,如果字典不适合您。

关于c# - 3个带linq的嵌套组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9793501/

相关文章:

javascript - 使用 jQuery 读取 XML 数据

html - Mozilla 将 <br></br> 翻译成 <br></br><br></br>

c# - 如何使用 Redis 支持的 ServiceStack ICacheClient 存储和检索枚举值

c# - 为外部集合中的每个项目断言内部集合中的元素数量

java - 用于最佳性能的 XML API

c# - C# 中的数据继承

c# - Stripe Payment : System.Net.WebException:请求已中止:无法创建 SSL/TLS 安全通道

c# - 这是计算表达式的候选者吗?

c# - 在 C# 中计算斐波那契数列

c# - 如何防止它在listview中被添加2次