2016-06-23 2 views
1

Я использую C#, .net4.0 и WinformC# list.sort и CompareTo бросить IndexOutOfRangeException

я реализовал метод сортировки списка пользовательских объектов. Основной класс имеет список объектов (lpHTC), которые будут сортироваться

public class PeriodeHTList 
{ 
    private List<PeriodeHTConflit> _lpHTC; 

    public PeriodeHTList() 
    { 
     _lpHTC = new List<PeriodeHTConflit>(); 
    } 

    public void AddPeriodeHTConflit(PeriodeHT pHT) 
    { 
     PeriodeHTConflit pHTC = new PeriodeHTConflit(); 
     pHTC.pHT = pHT; 
     _lpHTC.Add(pHTC); 
    } 
    public void Sort() 
    { 
     _lpHTC.Sort(); 
    } 
} 

Второй класс является более сложным, на самом деле. Переменная РНТ будет использовать в своего рода

public class PeriodeHTConflit : IComparable<PeriodeHTConflit> 
{ 
    public PeriodeHT pHT; 

    public PeriodeHTConflit() 
    { 
} 

    public int CompareTo(PeriodeHTConflit pHTC) 
    { 
     if(pHTC==null) 
      return 1; 

     if(pHT.date<=pHTC.pHT.date) 
     { 
      return -1; 
     } 
     else 
     { 
      return 1; 
     } 
    } 
} 

Последний класс

public class PeriodeHT 
{ 
    public DateTime date; 

    public PeriodeHT() 
    { 
    } 
} 

создать PeriodeHTList, а затем наполнить ее AddPeriodeHTConflit(). Затем я вызываю periodeHTListVar.Sort().

try 
{ 
    periodeHTListVar.Sort(); 
} 
catch (Exception ex) 
{ 
    //some error code 
} 

И я получаю первое событие Chance IndexOutOfRangeException. Уловка не выполняется, и программа продолжается. Но сортировка не завершена.

Я установил точку отладки в методе CompareTo(), и я получаю странное поведение. После нескольких правильных вызовов CompareTo все остальные вызовы используют два одинаковых объекта (объект PeriodeHTConflit и параметр pHTC) и всегда последний из несортированного списка.

Я использую Icomparable и CompareTo() для многих вещей без каких-либо проблем, кроме как здесь (и другого подобного объекта).

Может кто-нибудь мне помочь?

+0

возвратного pHT.date.СотрагеТо (pHTC.pHT.date); –

ответ

1

Я думаю, что в вы действуете

public int CompareTo(PeriodeHTConflit pHTC) 

Когда две даты равны, то возвращает 0.

См CompareTo document:

Примечания к реализующим: Для объектов A, B и C, должно быть выполнено следующее: A.CompareTo (A) должен возвращать ноль. Если A.CompareTo (B) возвращает ноль, то B.CompareTo (A) должен возвращать ноль. Если A.CompareTo (B) возвращает ноль, а B.CompareTo (C) возвращает ноль, то A.CompareTo (C) должен возвращать ноль. Если A.CompareTo (B) возвращает значение, отличное от нуля, тогда B.CompareTo (A) должно вернуть значение противоположного знака. Если A.CompareTo (B) возвращает значение x, не равное нулю, а B.CompareTo (C) возвращает значение y того же знака, что и x, то A.CompareTo (C) должно возвращать значение того же знака как х и у.

1

Если вы хотите, чтобы сравнить объекты, сравнивая их частей, а затем передать сравнение на части:

public int CompareTo(PeriodeHTConflit pHTC) 
{ 
    if(pHTC==null) 
     return 1; 

    if(pHT.date<=pHTC.pHT.date) 
    { 
     return -1; 
    } 
    else 
    { 
     return 1; 
    } 
} 

Этот фрагмент кода только частично правильно - он не возвращает 0, если две даты равны, и тогда это может смутить алгоритм сортировки, предоставив ему ложную информацию.

Лучше решение полагаться на сравнение дат:

public int CompareTo(PeriodeHTConflit pHTC) 
{ 
    if(pHTC==null) 
     return 1; 
    return pHT.date.CompareTo(pHTC.pHT.date); 
} 
Смежные вопросы