Linq与DateTime.Parse

时间:2017-02-06 22:39:00

标签: c# linq datetime

我有一个列表"网站"其中一项为" 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

3 个答案:

答案 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();

我假设您希望FromTo类型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();