Я попробовал этот пример в 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();