如何使用LINQ on XML数据执行OrderBy?

时间:2017-10-09 16:22:33

标签: c# xml linq

我在XML文件中有如下数据:

<history>
  <history-item id="1">
     <history-url>www.google.com/ncr</history-url>
     <history-date>29/06/2017</history-date>
     <history-time>5:27:25PM</history-time>
  </history-item>
  <history-item id="2">
    <history-url>www.yahoo.com</history-url>
    <history-date>10/03/2017</history-date>
    <history-time>5:30:25PM</history-time>
  </history-item>
  <history-item id="4">
    <history-url>www.google.com/ncr</history-url>
    <history-date>23/01/2014</history-date>
    <history-time>5:27:25PM</history-time>
  </history-item>
<history>

我的目标是根据history-date对此数据进行分组和排序。 我使用以下代码来实现此目的:

    XDocument history = XDocument.Load("history.xml");
    var details =
         from c in history.Descendants("history-item")
         group c by c.Element("history-date").Value into d
         select new
         {
             Value = d.Key,
             Rows = d.Elements("history-url")
         };

    details = details.OrderBy(c => c.Value);

然而,问题是 - 日期只按日期排序,即dd

当我尝试打印时,输出为:

10/03/2017
23/01/2014
29/06/2017

所需的输出是:

23/01/2014
10/03/2017
29/06/2017

感谢任何帮助!

3 个答案:

答案 0 :(得分:2)

您需要将c.value转换为实际日期。因为它只是一个字符串。

details = details.OrderBy(c => Convert.ToDateTime(c.Value));

答案 1 :(得分:2)

  

然而,问题是 - 日期仅按日期排序

这是因为c.Element("history-date").Value表达式产生string,而不是DateTime对象。因此,OrderBy将这些字符串放在词典顺序中,只要一位数的天数为零,就会按日排序。

您可以通过在获取这些字符串时解析这些字符串来解决此问题,或者在订购之前解决这些问题,如果您希望将它们保留为输出中的字符串:

...
select new
 {
     Value = DateTime.ParseExact(d.Key, "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None)
 ,   Rows = d.Elements("history-url")
 };

答案 2 :(得分:1)

details = details.OrderBy(c => DateTime.ParseExact(c.Value, "dd/MM/yyyy", CultureInfo.InvariantCulture));