Сделайте это с xsl, используя XslCompiledTransform, но убедитесь, что вы кэшируете XslCompiledTransform, потому что компиляция медленная, выполнение очень быстрое.
Итак:
- Напишите xsl, соответствующий вашему xml, отсортируете их и получите отсортированный список в качестве вывода
- Получите XslCompiledTransform, содержащий этот xsl из кэша, и, если он не существует, создайте его и вставьте в кеш
- Превратите ваш xml через xsl в новый XmlDocument
Это чертовски быстро, держит ваш код в чистоте и вы гибки, когда дело доходит до изменения реализации сортировки; это просто редактирование одного xsl.
Я набираю это, не проверяя, поэтому могут быть опечатки, но вот как вы должны поступить:
XslCompiledTransform xsl = (XslCompiledTransform)HttpRuntime.Cache.Get("my_xsl");
if (xsl == null)
{
string fileName = "path/to/your/xslfile.xsl";
xsl = new XslCompiledTransform();
xsl.Load(fileName);
HttpRuntime.Cache.Insert("my_xsl", xsl, new CacheDependency(new string[]{fileName}));
}
А для преобразования используйте метод где-то вроде этого:
public static XmlNode TransformToXml(IXPathNavigable xml, XslCompiledTransform xsl, XsltArgumentList arguments, XmlWriterSettings settings)
{
XmlDocument output = new XmlDocument();
using (XmlWriter writer = XmlWriter.Create(output.CreateNavigator().AppendChild()))
{
xsl.Transform(xml, arguments, writer);
}
return output;
}