Сортировка объектов в ArrayList по переменной DateTime внутри объектов - PullRequest
0 голосов
/ 01 марта 2012

У меня проблема.

У меня есть 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

Я попытался использовать операторы> и <для сравнения и получил те же результаты.Я также пытался использовать разные команды для преобразования строк в объекты DateTime, например <code>Convert.ToDateTime, DateTime.Parse.Попытка ввода без ЧЧ: мм (соответственно скорректировал код) и все еще имела тот же вывод.Я попытался не использовать IFormatProvider (установите его в null) и снова никуда не попал.

Случайно я нашел эту тему:

Как отсортировать ArrayList объектов DateTime по убываниюпорядок?

Я извлек все даты из объектов и поместил их в этот список DateTime.Использовал List.Sort(), и он выдал правильный вывод.Но потом я застрял в том, как использовать этот отсортированный список для сортировки моего EventHolder ArrayList.Некоторое время я стучал в эту стену и ничего не дал.

Я очень новичок в программировании, поэтому я едва знаю какой-либо хороший способ делать то, что я делаю.И это даже не работает.Кто-нибудь может объяснить мне, где я иду не так?

Ответы [ 4 ]

0 голосов
/ 01 марта 2012

Если вам не нужен 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();
0 голосов
/ 01 марта 2012

Это неправильный подход, imo, лучший способ сделать это - использовать Пользовательский компаратор .

   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 голосов
/ 01 марта 2012

То, что вы пытаетесь сделать, - это реализовать алгоритм сортировки, но, к сожалению, ваш неверный.Это почти похоже на Bubble Sort , который с самого начала является довольно медленным алгоритмом, но он не совсем корректен.

Намного лучший способ выполнить то, что вы пытаетесь сделать, это использовать Сортировать метод или ArrayList или общих классов 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 голосов
/ 01 марта 2012

Используйте эту перегрузку 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 () );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...