比较的问题

本文关键字:问题 比较 | 更新日期: 2023-09-27 17:56:50

我正在尝试实现一个排序列表。我已经创建了想要存储在列表中的类,但由于某种原因,当我尝试运行排序排序方法时,我得到了一个异常。似乎幕后的某些东西正在将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没有正确实现。

如果rhsthis相同(即此对象和要比较的对象相等),则CompareTo实现必须返回0。如果rhs == null,它也不应该失败,但应该以一致的方式排序null;这通常是通过始终在所有有效对象之前返回1null进行排序来完成的。

IComparable.CompareTo 的文档列出了以下规则,为了使排序正常运行,必须遵循这些规则:

  • 需要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