Как отсортировать XML-документ в linq по значению атрибута? - PullRequest
2 голосов
/ 05 января 2011

Я безуспешно пытался отсортировать мой 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>

Ответ дан здесь делаетне работает для меня.

Я использую MVS 2010 для Windows Phone 7.

Буду признателен за любую помощь.

-

Обновление

Спасибо за быстрые ответы!

Юхарр задал хороший вопрос ... я ожидал, что 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?

Ответы [ 2 ]

1 голос
/ 26 февраля 2011

Я надеюсь, что это поможет вам

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

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

Не забудьте использовать метод ToArray () для вашего people.

1 голос
/ 05 января 2011

На основании вопроса, на который вы ссылались, это работает:

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

(проверено на телефоне, чтобы подтвердить тоже.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...