在c#中将字符串转换为MM / yyyy以排序

时间:2016-12-12 19:16:27

标签: c# datetime-format

我之前看到的问题与我的查询有关,但无法弄清楚如何解决我的问题。

我有一个列表"网站"其中一项为"年"。它被定义为字符串,格式为" MM / yyyy"。当我尝试根据年份对列表进行排序时,我面临一个小问题。

"年"的数据是

01/2012
04/2012
01/2013
06/2012

当我使用orderby对列表进行排序时,我得到的输出是

01/2012
01/2013
04/2012
06/2012

这是不正确的。

无法使用Convert.ToDateTime转换字符串,因为字符串格式不包含日期值。我该怎么做呢?如何在不改变字符串格式的情况下实现DateTime.TryParseExact

注意:格式应该相同,列表应该排序。

4 个答案:

答案 0 :(得分:8)

你可以尝试这样的事情,而不必更改输入,如果你需要以不同的排序顺序查看OrderByDescending属性,这将给你订单

var dateList = new List<string> { "01/2012", "04/2012", "01/2013", "06/2012" };
var orderedList = dateList.OrderBy(x => DateTime.Parse(x)).ToList();

enter image description here

答案 1 :(得分:4)

您仍然可以将字符串转换为LINQ语句中的日期,并且这些项目将保留为字符串。

var strings = new[]
{
    "01/2012",
    "04/2012",
    "01/2013",
    "06/2012"
};

var ordered = strings.OrderBy(s =>
{
    var split = s.Split('/');
    return new DateTime(int.Parse(split[1]), int.Parse(split[0]), 1);
});

您的最后一项将是"01/2013"

正如MethodMan在答案中所示,DateTime.Parse()将能够解析MM/yyyy格式化日期。但是,如果您需要执行任何需要多行的操作,那么就可以执行此操作。 NB:这将 在针对DbContext的任何查询中工作!

答案 2 :(得分:0)

实施System.IComparable接口:

public int CompareTo(object obj)
{
    // Check null
    if (obj == null)
        return 1;

    // Check types
    if (this.GetType() != obj.GetType())
        throw new ArgumentException("Cannot compare to different type.", "obj");

    // Extract year and month
    var year = int.Parse(this.Year.SubString(3, 4));
    var month = int.Parse(this.Year.SubString(0, 2));

    // Extract year and month to compare
    var site = (Sites)obj;
    var objyear = int.Parse(site.Year.SubString(3, 4));
    var objmonth = int.Parse(site.Year.SubString(0, 2));

    // Compare years first
    if (year != objyear)
        return year - objyear;

    // Same year

    // Compare months
    return month - objmonth;
}

答案 3 :(得分:-1)

您还可以创建一个新的列表,其中日期转换为DateTime格式并在之后进行排序。它有很多系,但对学习有好处。

    class Sites
    {
        public string Year { get; set; }
    }
    class MainClass
    {
        static void Main()
        {
            List<Sites> ListOfSites = new List<Sites>();
            ListOfSites.Add(new Sites { Year = "01/2012" });
            ListOfSites.Add(new Sites { Year = "04/2012" });
            ListOfSites.Add(new Sites { Year = "01/2013" });
            ListOfSites.Add(new Sites { Year = "06/2012" });

            DateTime SiteYear;
            List<DateTime> listWithDates = new List<DateTime>(); 

            foreach (var item in ListOfSites)
            {
                if(DateTime.TryParse(item.Year, out SiteYear))
                {
                    listWithDates.Add(SiteYear);
                }
            }
            Display(SortAscending(listWithDates), "Sort Ascending");

        }
        static List<DateTime> SortAscending(List<DateTime> list)
        {
            list.Sort((a, b) => a.CompareTo(b));
            return list;
        }
        static void Display(List<DateTime> list, string message)
        {
            Console.WriteLine(message);
            foreach (var datetime in list)
            {
                Console.WriteLine(datetime);
            }
            Console.WriteLine();
        }
    }