Параметры сортировки XML C # .Net - PullRequest
0 голосов
/ 19 марта 2012

Я пытаюсь распечатать документы в различных заказах. Прямо сейчас у меня есть коллекция объектов печати и документ XML, где каждый узел имеет атрибуты, связанные с объектом печати в коллекции. Я хочу отсортировать эти объекты путем сортировки XML-документа на основе этих атрибутов.

Прямо сейчас я использую серию коллекций, которые я перебираю, и добавляю узел в новую коллекцию на основе сортировки, которая мне нужна. Проблема состоит в том, что 3 или 4 сорта становятся беспорядочными. Я уверен, что должен быть лучший способ сортировки этой коллекции объектов печати, используя XML или нет.

Вот некоторые атрибуты моего XML, по которым я сортирую:

  • Количество страниц
  • Почтовый индекс указан в документе
  • Название документа

У кого-нибудь есть идея получше?

спасибо,

РЕДАКТИРОВАТЬ -

мой документ будет выглядеть примерно так:

<xml>
<claim key="1" att1="wd" att2="de"/>
<claim key="2" att1="wd" att2="de"/>
<claim key="3" att1="wd" att2="de"/>
<claim key="4" att1="wd" att2="de"/>
</xml>

Значение ключа связано с местом в коллекции объектов печати. Узлы заявки могут иметь больше дочерних узлов, но я не думаю, что это актуально на данный момент. Я просто хотел бы иметь возможность сортировки на основе атрибутов, будет не менее 3 атрибутов, но могут быть добавлены еще. Кроме того, это должно быть универсальным, поэтому, если мне нужно изменить порядок сортировки, его будет несколько легко переставить. Как только у меня будет XML в правильном порядке, который я хочу, я использую цикл по XML, чтобы поместить ключ в список, а затем распечатать объекты Print по ключам в этом списке.

спасибо,

1 Ответ

1 голос
/ 19 марта 2012

Я попробовал этот пример в LINQPad, и он, кажется, делает то, что вы просите.

var root = XDocument.Parse("<xml><claim>...</claim></xml>").Element("xml");

var query = from claim in root.Elements("claim")
            let key = claim.Attributes("key").First().Value
            let att1 = claim.Attributes("att1").First().Value
            let att2 = claim.Attributes("att2").First().Value
            orderby key, att1, att2
            select claim;

Он находит <claim> узлы в вашем XML, выбирает атрибуты, которые вы хотитесортировать, сортировать их, а затем возвращает коллекцию IEnumerable<XElement>, представляющую отсортированные узлы <claim>.

Затем можно использовать результат query для построения объектов Print или изменитьвыше, чтобы он сделал это для вас:

var query2 = from claim in root.Elements("claim")
            let key = claim.Attributes("key").First().Value
            let att1 = claim.Attributes("att1").First().Value
            let att2 = claim.Attributes("att2").First().Value
            orderby key, att1, att2
            select new Print {
                        Property1 = key, // do type conversion if needed
                        Property2 = att1,
                        Property3 = att2
                    };

Я думаю, что он соответствует упомянутым вами требованиям сопровождения - вам просто нужно изменить, добавить / удалить / изменить имена атрибутов в запросе LINQ, если вам нужносортировать по-разному.

РЕДАКТИРОВАТЬ: Чтобы получить ключ в список int с, как в вашем комментарии ниже:

var printKeys = (from claim in query
                select Integer.Parse(claim.Attributes("key").First().Value)).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...