我有一个列表"网站"其中一项为" From"和" To"。它被定义为字符串,格式为" MM / yyyy"。当我尝试根据年份对列表进行排序时,我面临一个小问题。
"来自"的数据和" To"是
01/2012
04/2012
01/2013
06/2012
当我使用orderby对列表进行排序时,我得到的输出是
01/2012
01/2013
04/2012
06/2012
这是不正确的。
List<Site> List = new List<Site>();
DataSet DS = ClientDB.Sites(Id);
if (DS.HasTable0AndRows())
{
IEnumerable<DataRow> _DataRow = DS.Tables[0].AsEnumerable();
List = _DataRow.Select(x => new Site()
{
FileNum = x["File_Num"].ToString(),
From = x["From"].ToString(),
To = x["To"].ToString(),
}).ToList();
}
return List.OrderBy(x => x.FileNum).ToList();
}
我知道我必须使用DateTime.Parse
来转换From和To但是当我返回列表时如何在上述情况下使用DateTime.Parse
?
答案 0 :(得分:5)
您需要自定义比较器。
class DateComparer : IComparer<string>
{
public int Compare(string a, string b)
{
var a_date = DateTime.ParseExact(a, "MM/yyyy", null);
var b_date = DateTime.ParseExact(b, "MM/yyyy", null);
return a_date.CompareTo(b_date);
}
}
用法:
return List.OrderBy(x => x.From, new DateComparer()).ToList();
答案 1 :(得分:0)
这应该可以解决问题:
List<Site> List = new List<Site>();
DataSet DS = ClientDB.Sites(Id);
if (DS.HasTable0AndRows())
{
IEnumerable<DataRow> _DataRow = DS.Tables[0].AsEnumerable();
List = _DataRow.Select(x => new Site()
{
FileNum = x["File_Num"].ToString(),
From = DateTime.ParseExact(x["From"].ToString(), "mm/yyyy", CultureInfo.InvariantCulture),
To = DateTime.ParseExact(x["To"].ToString(), "mm/yyyy", CultureInfo.InvariantCulture),
}).ToList();
}
return List.OrderBy(x => x.From).ToList();
我假设您希望From
和To
类型DateTime
而不是string
。
如果你想把类型保持为字符串,那么你应该使用Uladzimir Palekh的答案。
答案 2 :(得分:0)
如果问题尚未解决,请使用:
在您的方法旁边添加此功能:
public int Compare(string a)
{
string[] arr = a.Split('/');
return int.Parse(arr[1] + arr[0]);
}
并像这样使用:
List<string> dates = new List<string> { "01/2012", "04/2012", "01/2013", "06/2012" };
dates = dates.OrderBy<string,int>(Compare).ToList();