简体   繁体   English

C#list.Sort和CompareTo抛出IndexOutOfRangeException

[英]C# list.Sort and CompareTo throw IndexOutOfRangeException

I use c#, .net4.0 and Winform 我使用c#、. net4.0和Winform

I have implemented a sort method for a list of custom object. 我已经为自定义对象列表实现了一种排序方法。 The main class has a list of objects (lpHTC), that will be sorted 主类有一个对象列表(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();
    }
}

The second class is more complex in reality. 第二类实际上更为复杂。 The pHT variable will be use in the 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;
        }
    }
}

The last class 最后一堂课

public class PeriodeHT
{
    public DateTime date;

    public PeriodeHT()
    {
    }
}

I create a PeriodeHTList, then populate it with AddPeriodeHTConflit(). 我创建了一个PeriodeHTList,然后用AddPeriodeHTConflit()填充它。 Then I call periodeHTListVar.Sort(). 然后,我调用periodeHTListVar.Sort()。

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

And I get a First Chance IndexOutOfRangeException. 我得到了第一个机会IndexOutOfRangeException。 The catch is not executed, and the program continues. 捕获未执行,程序继续。 But the sort is not completed. 但是排序没有完成。

I put a debug point in the CompareTo() method, and I get a strange behavior : After a few correct call to CompareTo, all the other calls use two same object (the PeriodeHTConflit object and the pHTC parameter), and always the last of the unsorted list. 我在CompareTo()方法中放置了一个调试点,并且得到了一个奇怪的行为:在对CompareTo进行了几次正确的调用之后,所有其他调用都使用了两个相同的对象(PeriodeHTConflit对象和pHTC参数),并且始终是最后一个未排序的列表。

I use Icomparable and CompareTo() for a lot of things without any problem, except here (and another similar objet). 除了这里(和另一个类似的对象)之外,我将Icomparable和CompareTo()用于很多事情没有任何问题。

Can someone help me ? 有人能帮我吗 ?

If you wish to compare objects by comparing their parts, then delegate comparison to parts: 如果希望通过比较对象的各个部分来比较对象,则将比较委托给各个部分:

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

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

This piece of code is only partially correct - it will not return 0 if two dates are equal, and then that may confuse the sorting algorithm by giving it false information. 这段代码仅是部分正确的-如果两个日期相等,它将不会返回0,然后通过给它错误的信息可能会使排序算法混乱。

Better solution is to rely on comparison of dates: 更好的解决方案是依靠日期比较:

public int CompareTo(PeriodeHTConflit pHTC)
{
    if(pHTC==null)
        return 1;
    return pHT.date.CompareTo(pHTC.pHT.date);
}

I think in you function 我想在你的职能

 public int CompareTo(PeriodeHTConflit pHTC)

When two dates are equal, you should return 0. 当两个日期相等时,您应该返回0。

See CompareTo document : 请参阅CompareTo文档

Notes to Implementers: For objects A, B and C, the following must be true: A.CompareTo(A) must return zero. 对实现者的说明:对于对象A,B和C,必须满足以下条件:A.CompareTo(A)必须返回零。 If A.CompareTo(B) returns zero, then B.CompareTo(A) must return zero. 如果A.CompareTo(B)返回零,则B.CompareTo(A)必须返回零。 If A.CompareTo(B) returns zero and B.CompareTo(C) returns zero, then A.CompareTo(C) must return zero. 如果A.CompareTo(B)返回零,而B.CompareTo(C)返回零,则A.CompareTo(C)必须返回零。 If A.CompareTo(B) returns a value other than zero, then B.CompareTo(A) must return a value of the opposite sign. 如果A.CompareTo(B)返回的值不是零,则B.CompareTo(A)必须返回相反符号的值。 If A.CompareTo(B) returns a value x not equal to zero, and B.CompareTo(C) returns a value y of the same sign as x, then A.CompareTo(C) must return a value of the same sign as x and y. 如果A.CompareTo(B)返回的x值不等于零,并且B.CompareTo(C)返回的y值与x相同,则A.CompareTo(C)必须返回与x相同的值。 x和y。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM