use*_*195 4 c# comparison compare compareto
我正在尝试实现排序列表.我已经创建了我想要存储在列表中的类,但出于某种原因,当我尝试运行排序方法时,我会抛出异常.幕后的东西似乎传递了我已经实现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;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
保存列表的类定义如下:
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我用来进行测试的程序:
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();
Run Code Online (Sandbox Code Playgroud)
测试程序的输出是:
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
Run Code Online (Sandbox Code Playgroud)
然后它似乎将一个nullrhs对象传递给compare方法,并NullReferenceException在尝试访问rhs的优先级时得到一个.
你能告诉我为什么会这样,我该怎么做才能解决这个问题?
如果您需要更多信息,请与我们联系.
当我运行你的代码时,我得到一个InvalidOperationException因为CompareTo没有正确实现.
如果相同,则您的CompareTo实现必须返回(即,此对象与被比较的对象相等).它也不应该失败,但应该以一致的方式排序; 这通常通过始终返回到所有有效对象之前的排序来完成.0rhsthisrhs == nullnull1null
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)返回与x相同符号的值y,则
A.CompareTo(C)需要返回与x和y相同符号的值.
要解决此问题,请确保您的实现CompareTo返回0时priority == rhs.priority && submitted == rhs.submitted.