c#排序元素,带注释

c#排序元素,带注释,c#,xml,sorting,linq-to-xml,C#,Xml,Sorting,Linq To Xml,我有一个表示以下xml的XElement: <Node> <Child id="1" /><!-- Comment 1 --> <Child id="3" /><!-- Comment 3 --> <Child id="2" /><!-- Comment 2 --> </Node> 如何对节点的子节点进行排序,以便XElement.ToString()方法返回以下内容? 必须移动子对象后面

我有一个表示以下xml的XElement:

<Node>
 <Child id="1" /><!-- Comment 1 -->
 <Child id="3" /><!-- Comment 3 -->
 <Child id="2" /><!-- Comment 2 -->
</Node>

如何对节点的子节点进行排序,以便XElement.ToString()方法返回以下内容? 必须移动子对象后面的注释和文本

<Node>
 <Child id="1" /><!-- Comment 1 -->
 <Child id="2" /><!-- Comment 2 -->
 <Child id="3" /><!-- Comment 3 -->
</Node>

假设每个元素后面都有相应的注释,请尝试以下操作:

var xDoc = XDocument.Parse(/* your xml */);
var reordered = xDoc.Root
                    .Elements("Child")
                    .Select(el => new {
                                        Element = el,
                                        Comments = el.NodesAfterSelf()
                                                     .TakeWhile(n => n.NodeType == XmlNodeType.Comment)
                                      })
                    .OrderBy(pair => (int)pair.Element.Attribute("id"))
                    .SelectMany(pair => new [] { pair.Element }.Concat(pair.Comments));
xDoc.Root.ReplaceAll(reordered);

编辑:编辑以允许每个元素有任意数量的注释(包括0);空白已被处理。

元素和注释之间可能存在空白。也可能有多条注释。@TWT-更新了我的答案以允许多条(或0条)注释,即使在以前的版本中,空格也不是问题。我想在这里添加的一条重要注释是,第一个节点之前的所有注释都将被删除。@TWT-这是绝对正确的;但是,您在问题描述中没有提到这些。此外,似乎没有任何默认的排序方法,如果你能进一步阐述你最初的问题,我会尽力提供帮助。