我使用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()用于很多事情,没有任何问题,除了这里(和另一个类似的对象)。
有人可以帮助我吗?
答案 0 :(得分:1)
我想你的功能
public int CompareTo(PeriodeHTConflit pHTC)
当两个日期相等时,您应该返回0.
对实施者的说明: 对于对象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);
}