2012-03-01 40 views
0

我有一個問題。對象由日期時間可變

我有對象的ArrayList。每個對象都包含一個DateTime數據字段。

我需要通過這個DateTime數據字段進行排序這個ArrayList

這是我當前的代碼,它不工作:

 for (int i = 0;i<EventHolder.Count;i++) 
     { 
      Event obj = (Event) EventHolder[i]; 
      try 
      { 
       obj2=(Event)EventHolder[i+1]; 
      } 
      catch 
      { 
       break; 
      } 
      DateTime date1 = DateTime.ParseExact(obj.Date_And_Time,"dd/MM/yyyy HH:mm",region); 
      DateTime date2 = DateTime.ParseExact(obj2.Date_And_Time, "dd/MM/yyyy HH:mm", region); 
      if (DateTime.Compare(date1,date2)>0) 
      { 
       Event tempobj=obj2; 
       EventHolder[i+1]=obj; 
       EventHolder[i]=tempobj; 
      } 
     } 
     foreach (Event i in EventHolder) 
     { 
      Console.WriteLine(i.Date_And_Time); 
     } 
     Console.ReadLine(); 

我用這3個日期,以測試它是否工作:

23/11/2011 12:15

28/06/2010 04:05

02/09/1992 03:54

的輸出始終是:

28/06/2010 04:05

1992年2月9日3點54

23/11/2011 12:15

我嘗試使用剛剛>和<運營商比較,得到了相同的結果。我用不同的命令字符串轉換爲DateTime對象,如Convert.ToDateTimeDateTime.Parse也試過。嘗試輸入沒有HH:毫米(相應地調整了代碼),仍然有相同的輸出。我試圖不使用IFormatProvider(將其設置爲空),並再次無處可去。

一次偶然的機會,我發現這個線程:

How to sort ArrayList of DateTime objects in descending order?

我提取的所有從對象的日期,並把它們放到這個日期列表。使用List.Sort()並且它產生了正確的輸出。但後來我被困在如何使用這個排序列表排序我的EventHolder ArrayList。我在這堵牆上撞了一段時間,並沒有產生任何結果。

我很新的節目,所以我幾乎不知道做我在做什麼什麼好辦法。它甚至不工作。 有人可以向我解釋我哪裏出錯了嗎?

+0

您是否必須堅持舊的和醜陋的ArrayList?如果您使用泛型集合和LINQ,則可以用1行代碼完成整個任務。 – 2012-03-01 15:34:54

+0

可以使用列表代替,不必是數組列表。 – eltaro 2012-03-01 15:51:54

+0

我建議不要使用LINQ來做這樣的事情。你可能得到的只是一個單一的代碼行,但它會比只使用'ArrayList.Sort()'或'名單的.sort()'顯著慢。 – xxbbcc 2012-03-01 16:35:34

回答

0

你想要做的是實現一個排序算法,但不幸的是你不是一個正確的。它看起來像Bubble Sort這是一個非常緩慢的算法,但它不是很正確。

一個更好的方法來完成你想要做的是使用Sort方法或ArrayList或通用列表類別<>類。這些排序方法允許您提供IComparer實現(或者在通用List的情況下爲比較委託)來指定排序條件,並在內部使用正確和有效的排序算法。

如果使用泛型列表<>你可以只通過一個lambda表達式並將它決定了分類標準,根據日期字段,例如:

// Assuming EventHolder is a List<Event> 
EventHolder.Sort((d1, d2) => DateTime.ParseExact(d1.Date_And_Time,"dd/MM/yyyy HH:mm",region).CompareTo(DateTime.ParseExact(d2.Date_And_Time,"dd/MM/yyyy HH:mm",region))); 
+0

什麼是lambda表達式? 我試過這個代碼,它給出了一個錯誤, 不能轉換lambda表達式鍵入:「System.Collections.Generic.IComparer ,因爲它不是一個委託類型。 – eltaro 2012-03-01 15:44:55

+0

這個評論框沒有足夠的空間來解釋lambda表達式是什麼,所以我只是要盡力給你一個想法,因爲它適用於您的情況:把它看成是一個匿名函數,聲明爲內聯,這被解釋由編譯器作爲委託。在我的例子中,lambda表達式是(d1,d2)=> ...這就像在這種情況下聲明一個接受兩個Event類型的參數d1和d2的函數,然後返回(=>)計算結果這兩個參數。 有關詳細信息,請參閱他有關lambda表達式的MSDN頁面:http://msdn.microsoft.com/en-us/library/3da4abas.aspx – 2012-03-01 15:49:10

+0

我已將EventHolder轉換爲列表,並添加了您的代碼。它仍然給我一個錯誤。 使用System.Linq添加;也沒有幫助。 – eltaro 2012-03-01 16:32:09

0

使用this重載ArrayList.Sort() - 您將得到一個與對象進行比較的回調函數,然後您可以輕鬆地比較對象中的兩個日期。

public class MyDateComparer : IComparer 
{ 
    int IComparer.Compare (Object x, Object y) 
    { 
     // Cast x and y to your object type and then compare the dates. Return 
     // -1, 0 or 1 depending on your comparison 
     return (...); 
    } 
} 

... 

myList.Sort (0, myList.Length, new MyDateComparer()); 
0

這是一個錯誤的方法imo,更好的方法是使用Custom comparer

public class SortByDateTime: IComparer { 
     // Calls CaseInsensitiveComparer.Compare with the parameters reversed. 
     int IComparer.Compare(Object x, Object y) { 
      // Compare objects according to the date 
      } 
     } 

    ... 
    // Sort the arraylist using the custom comparer 
    IComparer myComparer = new SortByDateTime(); 
    ArrayList mList = new ArrayList(); 
    mList.Sort(myComparer); 
+0

我不認爲ArrayList是一個泛型類型。你可能想糾正你的例子。 – xxbbcc 2012-03-01 15:29:16

+0

@xxbbcc感謝您的注意事項 – Shai 2012-03-01 15:31:41

+0

感謝您的快速回復。我現在試圖理解這段代碼,並將其適用於我的程序。 – eltaro 2012-03-01 15:34:01

0

如果你並不真正需要ArrayList和有.NET 3.5,請嘗試以下代替:

List<Event> eventHolder = ... // Just to make certain it's a List<Event> 
eventHolder = eventHolder 
    .OrderBy(e => DateTime.ParseExact(e.Date_And_Time,"dd/MM/yyyy HH:mm",region) 
    .ToList();