2016-06-23 66 views
1

我使用C#,.net4.0和WinForm的C#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(); 
    } 
} 

第二類是在現實中更復雜。該PHT變量會使用在排序

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 
} 

我得到了第一次機會IndexOutOfRangeException。該捕捉未被執行,並且程序繼續。但排序並未完成。我在CompareTo()方法中添加了一個調試點,並且我得到了一個奇怪的行爲:經過對CompareTo的一些正確調用,所有其他調用使用兩個相同的對象(PeriodeHTConflit對象和pHTC參數),以及總是最後的未排序列表。

我使用Icomparable和CompareTo()很多東西沒有任何問題,除了這裏(和另一個類似的objet)。

有人可以幫助我嗎?

+0

回報pHT.date。的CompareTo(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)返回與x相同符號的值y,則A.CompareTo(C)必須返回相同符號的值作爲x和y。

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); 
} 
相關問題