C#list.Sort和CompareTo抛出IndexOutOfRangeException

时间:2016-06-23 22:19:19

标签: c# sorting icomparable indexoutofrangeexception

我使用c#,。net4.0和Winform

我已经为自定义对象列表实现了一种排序方法。 主类有一个对象列表(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
}

我得到了First Chance IndexOutOfRangeException。捕获未执行,程序继续。但排序还没有完成。

我在CompareTo()方法中放了一个调试点,我得到了一个奇怪的行为:在对CompareTo进行了几次正确调用之后,所有其他调用都使用了两个相同的对象(PeriodeHTConflit对象和pHTC参数),并且总是最后一个未排序的列表。

我将Icomparable和CompareTo()用于很多事情,没有任何问题,除了这里(和另一个类似的对象)。

有人可以帮助我吗?

2 个答案:

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