我正在尝试实现一个排序列表。我已经创建了我想要存储在列表中的类,但是由于某种原因,当我尝试运行排序方法时,我抛出了一个异常。看来幕后有什么东西正在将 null
引用传递到我已实现的 CompareTo
方法中。
这是我认为相关的代码。
数据对象定义如下:
namespace PrioritisedRequestQueue
{
public class XactTask : IComparable<XactTask>
{
public int priority;
public DateTime submitted;
public string name;
public XactTask( int priority, DateTime submitted, string name)
{
this.priority = priority;
this.submitted = submitted;
this.name = name;
}
public int CompareTo(XactTask rhs )
{
//EXCEPTION OCCURS HERE AFTER A NULL RHS HAS BEEN PASSED IN**
Console.WriteLine("comparing " + rhs.priority+"to "+this.priority);
if (rhs.priority <= this.priority)
{
Console.WriteLine("Entered first if");
Console.WriteLine("comparing " + rhs.submitted + "to " +
this.submitted);
if (rhs.submitted <= this.submitted)
{
Console.WriteLine("Entered second if");
return 1;
}
else
{
return -1;
}
}
else
{
Console.WriteLine("In else");
return -1;
}
}
}
}
保存列表的类定义如下:
namespace PrioritisedRequestQueue
{
public class Class1
{
public List<XactTask> tasks;
public Class1()
{
tasks = new List<XactTask>();
}
public void sort()
{
tasks.Sort();
}
public void add(XactTask task)
{
tasks.Add(task);
}
}
}
这是我用来做测试的程序:
PrioritisedRequestQueue.Class1 tester = new PrioritisedRequestQueue.Class1();
tester.add(new PrioritisedRequestQueue.XactTask(1, DateTime.Now, "test1"));
tester.add(new PrioritisedRequestQueue.XactTask(1, DateTime.Now, "test2"));
Console.WriteLine(tester.tasks[0].name);
Console.WriteLine(tester.tasks[1].name);
tester.tasks.Sort();
测试程序的输出是:
comparing 1to 1 Entered first if
comparing 16/05/2011 14:41:57to 16/05/2011 14:41:57
Entered second if
comparing 1to 1 Entered first if
comparing 16/05/2011 14:41:57to 16/05/2011 14:41:57
Entered second if
comparing 1to 1
Entered first if
comparing 16/05/2011 14:41:57to 16/05/2011 14:41:57
Entered second if
comparing 1to 1
Entered first if
comparing 16/05/2011 14:41:57to 16/05/2011 14:41:57
Entered second if
然后它似乎将一个 null
rhs 对象传递给比较方法,当它尝试访问 rhs 的优先级时我得到一个 NullReferenceException
。
您能告诉我为什么会发生这种情况以及我必须采取什么措施来解决这个问题吗?
如果您需要更多信息,请告诉我。
最佳答案
当我运行您的代码时,我得到一个 InvalidOperationException
,因为 CompareTo
没有正确实现。
如果 rhs
与 this
相同,您的 CompareTo
实现必须返回0
>(即这个对象和被比较的对象是相等的)。如果 rhs == null
也不应该失败,但应该以一致的方式对 null
进行排序;这通常是通过始终返回 1
以在所有有效对象之前对 null
进行排序来完成的。
documentation for IComparable.CompareTo列出了以下规则,必须遵守这些规则才能使 Sort 正常运行:
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)
返回值 y 与 x 同号,则A.CompareTo(C)
需要返回 与 x 和 y 同号的值。
要解决此问题,请确保当 priority == rhs.priority && submitted == rhs.submitted
时,您的 CompareTo
实现返回 0。
关于c# - CompareTo 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6018631/