2011-12-16 31 views
5

我有一個包含一年中的月份的字符串列表。我需要能夠對這個清單進行排序,以便按月排列月份,而不是按字母順序排列。我一直在尋找一段時間,但是我看不到任何我找到的解決方案。在列表中排序月份

下面是如何添加月份的示例。它們是基於SharePoint列表中的字段動態添加的,因此它們可以按任意順序並可以有重複項(我正在使用Distinct()刪除這些項)。

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

想重新排序這:

February 
June 
August 
+0

你爲什麼不回發月份索引或號碼? – 2011-12-16 19:23:08

+0

你找到了什麼解決方案?這些解決方案的哪些部分難以理解? – phoog 2011-12-16 19:23:39

+0

雖然我需要我的月份名稱是羅馬尼亞語,但這對我有很大幫助,現在我知道如何處理我的問題了!謝謝! – Victor 2013-08-11 17:52:59

回答

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); 
+0

是否有一個原因,你會使用`DateTime`提供的自定義排序順序來執行它(解析後)? – lbergnehr 2011-12-16 20:07:00

+0

@seldon - 不是。只是擴展了OP的介紹。根據需要,這可能是他需要的一切 - 如果他需要一個對文化敏感的排序列表(並且包含所有月份),那是不同的。 – Oded 2011-12-16 20:26:10

0

創建enum並分配int值每月。用linq排序這件事。

1

如果你堅持只具有較幾個月的字符串列表,則必須使用另一個數據源檢索該月的指數通過它你可以對列表進行排序。例如,您可以使用月份名稱填充字典string鍵和int索引作爲值。然後,您可以使用重載方法List<T>.Sort(Comparison<T>)並傳入一個比較函數,該函數按名稱(通過將它們傳遞到字典中)返回月份的索引。

但是,我建議首先不要使用原始字符串,而應該使用代表一個月的更加結構化的數據類型。然後,您可以將索引嵌入到數據結構本身中,並根據該值進行排序,從而爲您提供更獨立的解決方案。

1

你需要一個排序列表<> ..如

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的休息。

這可以通過使用塞爾頓的回答創建一個功能得到改善,就像

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

然後用

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

以上。

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

您可以解析月份名稱爲日期(它假定當年和1天):

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