【发布时间】:2013-01-18 00:45:53
【问题描述】:
我有一个带有日期的List<string>。
我的清单是:
{"01/01/2013","10/01/2013","20/01/2013"}
我想将列表排序为如下所示:
{"20/01/2013","10/01/2013","01/01/2013"}
我该怎么做?
【问题讨论】:
我有一个带有日期的List<string>。
我的清单是:
{"01/01/2013","10/01/2013","20/01/2013"}
我想将列表排序为如下所示:
{"20/01/2013","10/01/2013","01/01/2013"}
我该怎么做?
【问题讨论】:
您不应该使用字符串表示数据 - 我们都生活在面向对象的世界中 :)
最好的方法是将这些字符串转换为实际的 DateTime 对象并通过 linq 以相反的顺序对它们进行排序:
var dates = Array.ConvertAll(dateStrings, x => DateTime.Parse(x));
return dates.OrderByDesc(x => x);
另一种方法是实现自定义排序功能,请参阅this link。然后你只需在排序函数中使用它:
DateAsStringComparer myComparer = new DateAsStringComparer();
dateStrings.Sort(myComparer);
【讨论】:
因为它们是 UK/AUS 格式(日/月/年),您可以使用 OrderByDescending 对它们进行排序:
List<string> dates = new List<string>() { "01/01/2013", "10/01/2013", "20/10/2013" };
foreach (var date in dates.OrderByDescending(x => x))
Console.WriteLine(date);
我个人会先将它们转换为 DateTime 对象..
【讨论】:
使用 linq:
var list = new List<string> {"01/01/2013", "10/01/2013", "20/01/2013"};
var orderedList = list.OrderByDescending(x => DateTime.Parse(x)).ToList();
更新(根据 cmets 中的问题):
你可以这样处理无效日期(无效日期在那里被视为default(DateTime)):
var list = new List<string> { "01/01/2013", "10/01/2013", "N/A" , "20/01/2013" };
var orderedList2 = list.OrderByDescending(x =>
{
DateTime dt;
DateTime.TryParse(x, out dt);
return dt;
});
或者,如果您想将无效的日期时间作为列表中的第一项:
var orderedList3 = list.OrderByDescending(x =>
{
DateTime dt;
if (!DateTime.TryParse(x, out dt)) return DateTime.MaxValue;
return dt;
});
您还可以过滤掉无效日期:
var filteredList = list.Where(x =>
{
DateTime dt;
return DateTime.TryParse(x, out dt);
}).Select(DateTime.Parse).OrderByDescending(x => x);
甚至更好:
var filteredList = list.Select(x =>
{
DateTime dt;
return new {valid = DateTime.TryParse(x, out dt), date = dt};
}).Where(x => x.valid).Select(x => x.date).OrderByDescending(x => x);
【讨论】:
为什么要使用List<string> 而不是List<DateTime>?
List<DateTime> dates = ...
dates.OrderByDescending(c => c).ToList();
【讨论】:
试试这个:
List<string> s = new List<string>() { "01/01/2013", "10/01/2013", "20/01/2013" };
var d = s.OrderByDescending(i => DateTime.ParseExact(i, "dd/MM/yyyy", null));
【讨论】:
要将自定义格式的DateTime字符串转换为统一格式的string,可以采用以下simple和safesn-p。
string formatStr = "yyyyMMddHHmmss";
string result = Convert.ToDateTime(inputStr).ToString(formatStr);
在代码内部,formatStr可以是DateTime类可以接受的任何可能的形式,你可以设置为你需要的格式,这里你可以使用与你的目标格式字符串匹配的dd/MM/yyyy作为“20/01/2013”。
所以对于你的情况,代码可以简单如下:
List<string> list = new List<string> { "01/01/2013", "10/01/2013", "20/01/2013" };
var listAfterSorting = list.OrderByDescending(t =>
Convert.ToDateTime(t).ToString("dd/MM/yyyy")
.ToList());
虽然在某些情况下,使用ParseExact解析数据时间字符串,它会抛出错误/异常String was not recognized as a valid DateTime,在这种情况下如果你转向使用TryParseExact,结果可能是default(DateTime)=@ 987654332@ 因为解析失败。因此,我不推荐ParseExact 或TryParseExact。
【讨论】: