C# LINQ到XML(LINQ Order by应用于一组组)
我有以下格式的数据C# LINQ到XML(LINQ Order by应用于一组组),c#,xml,linq,sorting,C#,Xml,Linq,Sorting,我有以下格式的数据 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#
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表示1级和位置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
中有上述数据,并应用了排序,但无法获得所需的输出
我也看过,但没有成功
我如何做到这一点。这对我来说很有用:
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);
使用此类定义:
public class Goal
{
public string TreeID;
public int ParentID;
public int GoalID;
public string GoalName;
}
假设您的数据类似于以下格式:
<Tree>
<TreeID>L1P1</TreeID>
<ParentID>0</ParentID>
<GoalID>31</GoalID>
<GoalName>Default Folder</GoalName>
</Tree>
我不能理解它。这里有什么东西?另外,请查看视图中更新的数据No TreeId is there level And position is composed in the ParentId。@nrsharma-我删除了
RegEx
答案,因为它显然不正确。我的第一个解决方案仍然有效。我已经添加了项的定义
。您可以使用“ParentId”中的级别和位置值吗?@nrsharma-它已经可以使用ParentId
了-除非我遗漏了什么。我使用了OrderBy和ThenBy,但没有给出正确的输出。@nrsharma我看到您已经更新了数据格式。您是否实际拥有数据中的级别和位置?或者是根据进球数和记录是否有父ID推断出来的?如果您可以发布数据的实际XML格式,那就更好了。
<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();