2011-01-05 59 views
2

我试图通过属性的值来排序我的xml文件,但没有运气。如何使用属性值对linq中的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> 

给出here回答没有为我工作。

我使用MVS 2010为Windows Phone 7的

我会感谢任何帮助。

-

更新

感谢您的快速反应!

juharr问了一个很好的问题...我期待OrderBy会修改data。现在我知道我错了。

我想修改data,我已经做了如下(感谢马特·莱西):

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

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

,但我仍然一无所获。 Data是空的,它只包含<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); 

是任何其他方式(更优雅)修改data使用OrderBy而不是创建datatemp

+1

你能更具体地说“不幸”吗? – fejesjoco 2011-01-05 12:47:40

+2

您是在捕获'OrderBy'的结果,还是期望修改'data'? – juharr 2011-01-05 13:24:37

+0

我知道这是一个古老的问题。但是,如Dima所说,通过添加.ToList()或.ToArray()来避免数据变量变量。 'stuff.OrderBy(...)。ToList()'在添加到人员时阻止IEnumerable为空。 – Mixxiphoid 2014-04-02 16:48:27

回答

1

根据您链接到的问题,这个工程:

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")); 

(在手机上测试,以确认过。)

+0

这将按int.sort的string.sort进行排序? – 2013-10-25 15:56:40

1

我希望这可以帮助你

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

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

不要为为你的people使用ToArray()方法。

相关问题