【问题标题】:LINQ TO XML (Linq Order by apply for a set of groups)LINQ TO XML(Linq Order by 申请一组组)
【发布时间】:2014-03-27 05:58:58
【问题描述】:

我有以下格式的数据

ParentID                            GoalID   GoalName
PId:0#Position:1#Level:1            31       Default Folder
PId:0#Position:2#Level:1            32       Folder 1
PId:0#Position:3#Level:1            33       Folder 2
PId:31#Position:1#Level:2           34       Sub-Folder in Default Folder

这里的 L1P1 表示 Level 1 和 Position 1。

我想要的是我想根据级别和位置对其进行排序,以便数据看起来像

ParentID                            GoalID   GoalName
PId:0#Position:1#Level:1            31       Default Folder
PId:31#Position:1#Level:2           34       Sub-Folder in Default Folder
PId:0#Position:2#Level:1            32       Folder 1
PId:0#Position:3#Level:1            33       Folder 2

我在XElement 中有上述数据,并应用排序但无法获得所需的输出。

Ref:我也看了this,但没有成功

我如何做到这一点。

【问题讨论】:

    标签: c# xml linq sorting


    【解决方案1】:

    这对我有用:

    var lookup = items.ToLookup(x => x.ParentID);
    
    Func<int, IEnumerable<Goal>> treeOrder = null;
    treeOrder = n =>
        lookup[n].SelectMany(x => new [] { x, }.Concat(treeOrder(x.GoalID)));
    
    var results = treeOrder(0);
    

    我得到以下输出:


    集合items是:

    var items = new []
    {
        new Goal { TreeID = "L1P1", ParentID = 0, GoalID = 31, GoalName = "Default Folder" },
        new Goal { TreeID = "L1P2", ParentID = 0, GoalID = 32, GoalName = "Folder 1" },
        new Goal { TreeID = "L1P3", ParentID = 0, GoalID = 33, GoalName = "Folder 2" },
        new Goal { TreeID = "L2P1", ParentID = 31, GoalID = 34, GoalName = "Sub-Folder in Default Folder" },
    };
    

    用这个类定义:

    public class Goal
    {
        public string TreeID;
        public int ParentID;
        public int GoalID;
        public string GoalName;
    }
    

    【讨论】:

    • 我无法理解。这里的物品是什么?并且请在视图中查看更新的数据 No TreeId is there level 并且位置由 ParentId 组成。
    • @nrsharma - 我删除了 RegEx 答案,因为它显然不正确。我的第一个解决方案仍然有效。我添加了items 的定义。
    • 你能让它使用“ParentId”中的级别和位置值吗?
    • @nrsharma - 它确实可以与 ParentID 一起使用 - 除非我遗漏了什么。
    【解决方案2】:

    假设您的数据类似于以下格式:

    <Tree>
        <TreeID>L1P1</TreeID>
        <ParentID>0</ParentID>
        <GoalID>31</GoalID>
        <GoalName>Default Folder</GoalName>
    </Tree>
    

    基本上你想先按位置排序,然后按级别:

    var trees = doc.Descendants("Tree")
        .OrderBy(x => Convert.ToInt32(x.Element("TreeID").Value.Substring(x.Element("TreeID").Value.IndexOf("P") + 1)))
        .ThenBy(x => Convert.ToInt32(x.Element("TreeID").Value.Substring(1, x.Element("TreeID").Value.IndexOf("P") - 1)))
        .ToList();
    

    【讨论】:

    • 我确实使用了 OrderBy 和 ThenBy 但它没有给出正确的输出。
    • @nrsharma 我看到您已经更新了数据格式。你真的有数据中存在的级别和位置吗?还是从GoalID和记录是否有ParentID推导出来的?如果您可以发布数据的实​​际 XML 格式,那就更好了。
    猜你喜欢
    • 1970-01-01
    • 2011-06-28
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多