2010-06-28 39 views
3

我有一個包含日期時間值轉換爲字符串的字符串列表的列表。列表中還有其他值,因此我無法將列表設置爲完整的DateTime列表。列表的列表與字符串日期排序?

我有一行代碼對列表進行排序,但它按字符串值排序日期,而不是DateTime值(這是我想要的)。我怎樣才能修改我的代碼,以便按照DateTime正確排序?

//This sorts the parent list by the 2nd column of the child list 
List.Sort((a, b) => -1 * a[1].CompareTo(b[1])); 

編輯:

樣品清單內容:
值1,2010-06-28 10:30:00.000
值2,2010-06-27 10:30:00.000
值2,2010 -06-26 10:30:00.000

+0

可您發佈名單的一些內容? – 2010-06-28 15:36:45

+0

我在原帖中添加了一些示例列表內容 – sooprise 2010-06-28 15:39:08

+0

您的列表內容是字符串嗎?你正在訪問它,就像它是一個字符串數組。 – 2010-06-28 15:52:54

回答

6

嘗試folloting

List.Sort((a,b) => -1 * DateTime.Parse(a[1]).CompareTo(DateTime.Parse(b[1]))); 

或者,如果你爲L INQ方便且不需要現場排序

var sorted = myList.OrderBy(x => DateTime.Parse(x[1])); 
+1

DateTime.Parse引發以下錯誤:字符串未被識別爲有效的DateTime。 我是否需要將DateTime重新轉換爲字符串? – sooprise 2010-06-28 15:45:22

+0

@Soo那麼你的集合中的字符串實際上不是你指定的問題的日期時間(或者它們是無法識別的格式)。這些字符串是如何進入這個數據結構的?你能告訴我們一些代碼嗎? – JaredPar 2010-06-28 16:06:13

+0

數據格式來自獲取SQL數據庫結果的LINQ查詢。不應該C#能夠識別日期格式嗎?我很困惑... – sooprise 2010-06-28 16:18:36

0

您首先將字符串解析爲DateTime。假設第二列始終是格式良好的日期/時間字符串。下面的代碼使用LINQ創建一個單獨的排序列表:

sortedList = yourList.OrderBy(item => DateTime.Parse(item[1])).ToList(); 

如果您需要的地方進行排序,你可以這樣做使用:

List.Sort((a,b)=>return DateTime.Parse(b[1]).CompareTo(DateTime.Parse(a[1])); 

根據您的日期的repsented,你可能想要考慮使用DateTime.ParseExact()

+0

考慮我的日期的格式設置: YYYY-MM-DD HH:MM:ss.mmm 我將如何使用ParseExact(),使這項工作正常? – sooprise 2010-06-28 17:07:34

0

您需要在比較之前將[1]轉換爲日期時間。

List.Sort((a, b) => -1 * DateTime.Parse(a[1]).CompareTo(DateTime.Parse(b[1]))) 

編輯:

如果填充列表中的LINQ查詢填充它作爲一個字符串列表,那麼你需要獲取表示字符串的日期部分項目的子字符串。 DateTime.Parse不會奇蹟般地挑出其中包含日期值的字符串部分。

如果是這種情況,並且您正在考慮使用string.Split,請確保您知道日期的格式,因爲某些格式允許使用逗號。

+0

讓我看看我是否理解正確。 a [1]和b [1]表示每個子列表中的第二個值,它們應該是DateTime項目本身。在這種情況下不應該使用DateTime.Parse(不是)。我不確定爲什麼DateTime.Parse不工作,因爲(據我瞭解)a [1]和b [1]已經是日期字符串。 – sooprise 2010-06-28 18:16:07

2

您應該創建自己的自定義比較器。

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<string> list = new List<string> 
           { 
            "Value1, 2010-06-28 10:30:00.000", 
            "Value2, 2010-06-27 10:30:00.000", 
            "Value3, 2010-06-26 10:30:00.000" 
           }; 

     list.Sort(new MyComparer()); 
    } 
} 

internal class MyComparer : IComparer<string> 
{ 
    public int Compare(string x, string y) 
    { 
     var xItems = x.Split(new []{','}); 
     var yItems = y.Split(new []{','}); 
     var xDateTime = DateTime.Parse(xItems[1]); 
     var yDateTime = DateTime.Parse(yItems[1]); 
     return xDateTime.CompareTo(yDateTime); 
    } 
} 
0

也許像

List<string> list = new List<string> 
{ 
"Value1, 2010-06-28 10:30:00.000", 
"Value2, 2010-06-27 10:30:00.000", 
"Value3, 2010-06-26 10:30:00.000" 
}; 

list.Sort((a, b) => 
    { 
     string[] aSplit = a.Split(','); 
     string[] bSplit = b.Split(','); 

     if (aSplit.Count() < 2 && bSplit.Count() < 2) 
      return a.CompareTo(b); 

     DateTime date1, date2; 

     if (!DateTime.TryParse(aSplit[1].Trim(), out date1) || 
      !DateTime.TryParse(bSplit[1].Trim(), out date2)) 
      return a.CompareTo(b); 

     return date2.CompareTo(date1); 
    });