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

Convert string to MM/yyyy in c# to sort

我以前看过与我的查询相关的问题,但无法弄清楚如何解决我的问题。

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

"Year" 的数据是

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

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

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

这是不正确的。

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

注意:格式要一致,列表要排序。

您可以在不更改输入的情况下尝试这样的操作,这将为您提供您喜欢的顺序,如果您需要不同的排序顺序,还可以查看 OrderByDescending 属性

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

您仍然可以在 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 格式的日期。但是,如果您需要执行任何需要多行的操作,这就是您可以做到的。 注意:这将不会在针对 DbContext 的任何查询中工作!

实现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;
}

您还可以创建一个新列表,将日期转换为日期时间格式,然后对其进行排序。台词很多,但很适合学习。

    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();
        }
    }