在列表中对月份进行排序

时间:2011-12-16 19:20:07

标签: c#

我有一个字符串列表,其中包含一年中的几个月。我需要能够对此列表进行排序,以便月份按月排序,而不是按字母顺序排列。我一直在寻找一段时间,但我无法看到我已经找到的任何解决方案。

以下是如何添加月份的示例。它们是基于SharePoint列表中的字段动态添加的,因此它们可以按任何顺序排列,并且可以包含重复项(我将使用Distinct()删除它们。)

List<string> monthList = new List<string>();
monthList.Add("June");
monthList.Add("February");
monthList.Add("August");

想将此重新排序为:

February
June
August

8 个答案:

答案 0 :(得分:6)

您可以将字符串解析为DateTime,然后使用month整数属性进行排序。请参阅此处了解支持的月份名称:http://msdn.microsoft.com/en-us/library/system.globalization.datetimeformatinfo.monthnames.aspx

这样的事情:

var sortedMonths = monthList
    .Select(x => new { Name = x, Sort = DateTime.ParseExact(x, "MMMM", CultureInfo.InvariantCulture) })
    .OrderBy(x => x.Sort.Month)
    .Select(x => x.Name)
    .ToArray();

答案 1 :(得分:2)

您可以使用Dictionary<int,string>代替,使用int作为月份编号进行排序,然后按键排序。

IDictionary<int,string> monthList = new Dictionary<int,string>();
monthList.Add(6, "June");
monthList.Add(2, "February");
monthList.Add(8, "August");

var sorted = monthList.OrderBy(item => item.Key);

答案 2 :(得分:2)

您可以将月份名称解析为日期(假设当前年份和第1天):

monthList = monthList.OrderBy(s=> DateTime.ParseExact(s, "MMMM", new CultureInfo("en-US"))).ToList();

答案 3 :(得分:1)

如果您坚持只列出表示月份的字符串,那么您必须使用另一个数据源来检索该月份的索引,您可以通过该索引对列表进行排序。例如,您可以使用月份名称填充字典作为string键,并使用int索引作为值。然后,您可以使用重载方法List<T>.Sort(Comparison<T>)并传入一个比较函数,该函数按名称返回月份索引(通过将它们传递到字典中)。

但是,我建议不首先使用原始字符串,而是使用表示月份的结构化数据类型。然后,您可以将索引嵌入到数据结构本身中,并根据该值进行排序,从而为您提供更加独立的解决方案。

答案 4 :(得分:1)

您需要一个SortedList&lt;&gt; ..比如

SortedList<int,string> monthList=new SortedList<int,string>();
monthList.Add(6,"June");
monthList.Add(2,"February");
monthList.Add(8,"August");   
IList<string> sortedMonthList=monthList.Values;

然后使用sortedMonthList进行其余的工作。

这可以通过使用seldon的答案来创建函数来改进,就像

一样
public static int MonthNumFromName(String monthname)
{ ... }

然后使用

monthList.Add(MonthNumFromName("June"),"June");

的上方。

答案 5 :(得分:0)

创建enum并为每个月分配int个值。用linq对事物进行排序。

答案 6 :(得分:0)

嗯,我猜这里没有任何排序技术,只有纯月作为字符串。

您可以使用Dictionary<int, string>并使用int来对月份进行排序。

如果我没有弄错,你实际上有一个月份列表作为字符串,那你为什么不这样做?

List<string> months = new List<string> { "January", "February", ..., "December" };

var yourSortedMonthsInYourOriginalList = months.Where(m => 
                                              originalList.Any(o => o == m)).ToList();

答案 7 :(得分:0)

您可以构建自己的排序类:

    static void Main(string[] args)
    {
        List<string> monthList = new List<string>();
        monthList.Add("June");
        monthList.Add("February");
        monthList.Add("August");

        monthList.Sort(new _mysort());

    }

    private class _mysort : IComparer<string>
    {

        public int Compare(string x, string y)
        {
            if (x=="February" && y=="June")
            {
                return -1;
            }

            return 0;
        }
    }

但我认为您应该使用Enum,并将其转换为字符串,然后您可以使用数字对其进行排序。

 enum months
    {
        Jan =0,
        Feb =1
    }

像:

       List<months> mlist = new List<months>() { months.Feb, months.Jan };
        //sort
        mlist = mlist.OrderBy(e => (int)e).ToList();
       //print
        mlist.ForEach(e => Console.WriteLine(e.ToString()));