如何使用 Linq 在 C# 中按 2 个属性对 XML 内容进行排序?

How to sort XML content by 2 Attributes in C# using Linq?

我是 C# 的新手,想通过 START 属性对内存中的 XML 进行排序,但我需要考虑到 START_PLUSDAY 属性存在。

这是我的 XML:

<SCHEDULE>
   <PROGS>
      <PROG START="07:00:00" END="08:00:00">
          <ID></ID>
          <DATA>...</DATA>
             <STUFF>...</STUFF>
      </PROG>
      <PROG START="01:00:00" START_PLUSDAY="1" END="02:00:00" END_PLUSDAY="1">
          <ID></ID>
          <DATA>...</DATA>
             <STUFF>...</STUFF>
      </PROG>
   </PROGS>
</SCHEDULE>

我想要的结果应该是这样的:

<SCHEDULE>
   <PROGS>
      <PROG START="07:00:00" END="08:00:00">
          <ID></ID>
          <DATA>...</DATA>
             <STUFF>...</STUFF>
      </PROG>
      <PROG START="01:00:00" START_PLUSDAY="1" END="02:00:00" END_PLUSDAY="1">
          <ID></ID>
          <DATA>...</DATA>
             <STUFF>...</STUFF>
      </PROG>
   </PROGS>
</SCHEDULE>

尝试以下操作:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            XElement progs = doc.Descendants("PROGS").FirstOrDefault();

            List<XElement> sortedProg = progs.Elements("PROG")
                .OrderBy(x => (int?)x.Attribute("START_PLUSDAY"))
                .ThenBy(x => (DateTime)x.Attribute("START")).ToList();
            XElement newProgs = new XElement("PROGS", sortedProg);

            progs.ReplaceWith(newProgs);
        }
    }
}