通过对象内的DateTime变量对ArrayList中的对象进行排序

时间:2012-03-01 15:19:42

标签: c# 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 04:05

     

02/09/1992 03:54

输出始终为:

  

28/06/2010 04:05

     

02/09/1992 03:54

     

23/11/2011 12:15

我尝试使用&gt;和&lt;运营商进行比较并得到相同的结果。我还尝试使用不同的命令将字符串转换为DateTime对象,如Convert.ToDateTimeDateTime.Parse。尝试在没有HH的情况下进入:mm(相应地调整了代码)并且仍然具有相同的输出。我尝试不使用IFormatProvider(将其设置为null)并再次无处可寻。

偶然的机会,我找到了这个帖子:

How to sort ArrayList of DateTime objects in descending order?

我从对象中提取了所有日期并将它们放入此DateTime列表中。使用List.Sort()并生成正确的输出。但后来我陷入了如何使用这个排序列表来排序我的EventHolder ArrayList。我已经在这堵墙上敲了一会儿,没有结果。

我对编程很陌生,所以我几乎不知道做我正在做的事情的任何好方法。它甚至不起作用。 任何人都可以向我解释我哪里出错了吗?

4 个答案:

答案 0 :(得分:0)

使用ArrayList.Sort()的{​​{3}}重载 - 您将获得与对象进行每次比较的回调,然后您可以轻松比较对象中的两个日期。

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

答案 1 :(得分: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);

答案 2 :(得分:0)

你要做的是实现一种排序算法,但遗憾的是你的排序算法不正确。它几乎看起来像Bubble Sort,这是一个非常慢的算法,但它不太正确。

更好地完成您要做的事情的方法是使用Sort方法或ArrayList或通用List&lt;&gt;类。这些排序方法允许您提供IComparer实现(或通用List的比较委托)以指定排序条件,并在内部使用正确有效的排序算法。

如果您使用通用列表&lt;&gt;你可以传入一个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)));

答案 3 :(得分: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();