2012-03-01 9 views
0

問題があります。オブジェクト内のDateTime変数によるArrayListのオブジェクトの並べ替え

私はArrayListのオブジェクトを持っています。各オブジェクトには、DateTimeデータフィールドが含まれています。

これは、ArrayListによってこれをソートする必要があります。DateTimeデータフィールド。

これは私の現在のコードであり、それは動作しません:

 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 4時05分

1992年2月9日午前3時54分

出力は常にある:

28/06/2010午前4時05

1992年2月9日午前3時54

23/11/2011 12時15

比較のために>と<という演算子を使用してみましたが、同じ結果が得られました。また、別のコマンドを使用して、文字列をConvert.ToDateTimeDateTime.ParseなどのDateTimeオブジェクトに変換しようとしました。 HH:mm(それに応じてコードを調整)なしで入力しようとしても、同じ出力が得られました。私はIFormatProvider(nullに設定)を使用せずにもう一度やりませんでした。私は、オブジェクトのすべての日付を抽出し、このDateTimeのリストに入れて

How to sort ArrayList of DateTime objects in descending order?

:偶然

は、私がこのスレッドを発見しました。 List.Sort()を使用し、正しい出力が得られました。しかし、このソートされたリストを使用してEventHolderのArrayListをソートする方法については悩んでいます。私はこの壁をしばらく叩いていて、何の結果ももたらさなかった。

私はプログラミングにとても慣れていないので、私がやっていることをする良い方法はほとんど分かりません。そしてそれはうまくいかない。 誰かが私に間違っていると私に説明することができますか?

+0

古い醜いArrayListに固執する必要はありますか?ジェネリックコレクションとLINQを使用した場合、この作業は1行のコードで実行できます。 –

+0

代わりにリストを使用できますが、arraylistである必要はありません。 – eltaro

+0

このようなものにはLINQを使わないことをお勧めします。コードは1行しか得られませんが、 'ArrayList.Sort()'や 'List .Sort()'を使うよりもかなり遅くなります。 – xxbbcc

答えて

0

ソートアルゴリズムは実装していますが、残念ながら正しいものはありません。 Bubble Sortのように見えますが、これはかなり遅いアルゴリズムですが、それは正しくありません。

あなたがしようとしていることを達成するためのもっと良い方法は、SortメソッドまたはArrayList、またはgeneric List <>クラスを使用することです。これらのソートメソッドを使用すると、ソート基準を指定するIComparer実装(またはジェネリックListの場合は比較デリゲート)を提供でき、内部的には正しいソートアルゴリズムを使用します。

あなたはジェネリックリスト<を使用する場合>あなただけのようなので、ラムダ式に渡すと、それは日付フィールドに基づいて並べ替えの基準を規定するかもしれない:

// 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

ラムダ式は何ですか? このコードを試しましたが、エラーが出ます。 ラムダ式を「System.Collections.Generic.IComparer 」に変換できません。これは、デリゲート型ではないためです。 – eltaro

+0

このコメントボックスは、ラムダ式が何であるかを説明するのに十分なスペースではないので、私はちょうどあなたのケースに当てはまるようなアイディアを与えようとしています。インラインで宣言された、デリゲートとしてコンパイラによって。私の例では、ラムダ式は(d1、d2)=> ...です。この場合のEvent型の2つのパラメータd1とd2を引数とする関数を宣言してから、計算の結果を返します(=>) 2つのパラメータ ラムダ式に関するMSDNのページはこちらhttp://msdn.microsoft.com/en-us/library/3da4abas.aspx –

+0

EventHolderをList に変換し、コードを追加しました。それは私にまだエラーを与える。 System.Linqを使用して追加する。どちらも役に立たなかった。 – eltaro

0

thisのオーバーロードArrayList.Sort()を使用すると、オブジェクトとの比較ごとにコールバックが発生し、オブジェクト内の2つの日付を簡単に比較できます。

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

これは間違ったアプローチですが、より良い方法は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

+0

@xxbbccお返事ありがとうございます。 – Shai

+0

お返事ありがとうございます。私は今、このコードを理解し、それを私のプログラムに適応しようとしています。 – eltaro

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