C# 如何按属性值对linq中的XML文档进行排序?

C# 如何按属性值对linq中的XML文档进行排序?,c#,xml,linq,sorting,windows-phone-7,C#,Xml,Linq,Sorting,Windows Phone 7,我试图按属性值对xml文件进行排序,但没有成功 data.Descendants("person").OrderBy(x => x.Attribute("id").Value); 数据包括: <persons> <person id="1"> <name>Abra</name> <age>25</age> </person> <person id="2">

我试图按属性值对xml文件进行排序,但没有成功

data.Descendants("person").OrderBy(x => x.Attribute("id").Value);
数据包括:

<persons>
  <person id="1">
    <name>Abra</name>
    <age>25</age>
  </person>
  <person id="2">
    <name>Cadabra</name>
    <age>29</age>
  </person>
  <person id="4">
    <name>Hokus</name>
    <age>40</age>
  </person>
  <person id="3">
    <name>Pokus</name>
    <age>30</age>
  </person>
</persons>
但我还是一无所获<代码>数据为空,它只包含

我不知道现在怎么了


我通过使用以下代码来解决我的问题:

    XDocument datatemp = new XDocument(data);

    var people = datatemp.Descendants("person").OrderBy(x => (int)int.Parse(x.Attribute("id").Value));

    data.Descendants("person").Remove();
    data.Element("persons").Add(people);

使用
OrderBy
而不是创建
datatemp
来修改
数据是否有任何其他方式(更优雅)?

基于您链接到的问题,此方法有效:

var people = from p in data.Elements("person")
             orderby (string)p.Attribute("id")
             select p;

(也在电话上进行了测试以确认。)

我希望这对您有所帮助

var people = data.Elements("person").OrderBy(p => (string)p.Attribute("id")).ToArray();

data.Descendants("person").Remove();
data.Element("persons").Add(people);

别忘了对你的
人使用ToArray()方法

你能更具体地说一下“不走运”吗?你是在捕获
OrderBy
的结果还是希望它修改
数据
?我知道这是一个古老的问题。但是,正如Dima所说,可以通过添加.ToList()或.ToArray()来避免datatemp变量
stuff.OrderBy(…).ToList()
防止您的IEnumerable在添加到persons时为空。这将按string.sort或int.sort排序?
var people = data.Elements("person").OrderBy(p => (string)p.Attribute("id"));
var people = data.Elements("person").OrderBy(p => (string)p.Attribute("id")).ToArray();

data.Descendants("person").Remove();
data.Element("persons").Add(people);