[英]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.