c# - CompareTo 的问题

标签 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;
        }
    }
}
}

保存列表的类定义如下:

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 进行排序;这通常是通过始终返回 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/

相关文章:

c# - 在基类中定义后,是否需要在派生类中定义相同的接口(interface)?

Python csv逐个单元迭代以找出更大的值并对行执行删除

c# - 如何在不使用 asp.net 中的自动回发和更新面板的情况下获取 Label 中的下拉列表选定值

c# - 用于密码哈希的 Rijndael 算法替代方案

c++ - 比较 std::addressof() 与十六进制数

java - java中如何比较两个字符串?

c++ - 将字符串变量与一组字符串常量进行比较的最佳方法是什么?

vb.net - SortedList“无法比较数组中的两个元素”

c# - 打开新窗口并选择或突出显示文件夹

C++ Boost 预处理器相等性测试