我在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
感谢任何帮助!
答案 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));