Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 此Icomparer中导致空引用的不一致性在哪里?_C#_.net_Compare_Icomparable_Icomparer - Fatal编程技术网

C# 此Icomparer中导致空引用的不一致性在哪里?

C# 此Icomparer中导致空引用的不一致性在哪里?,c#,.net,compare,icomparable,icomparer,C#,.net,Compare,Icomparable,Icomparer,我在自定义IComparer实现中接收到一个空对象,尽管它应用于的集合中没有空条目。我的理解是,这可能是由IComparer实现中的不一致引起的。我无法在下面的代码中发现这可能发生在哪里 作为参考,其目的是首先按“正确”属性对其进行排序,然后如果它们相同,则根据“TiebarkerDelta”属性进行排序,该属性的排序最接近于零,而不经过检查 public int Compare(IFoolsSortable a, IFoolsSortable b) {

我在自定义IComparer实现中接收到一个空对象,尽管它应用于的集合中没有空条目。我的理解是,这可能是由IComparer实现中的不一致引起的。我无法在下面的代码中发现这可能发生在哪里

作为参考,其目的是首先按“正确”属性对其进行排序,然后如果它们相同,则根据“TiebarkerDelta”属性进行排序,该属性的排序最接近于零,而不经过检查

        public int Compare(IFoolsSortable a, IFoolsSortable b)
    {
        int value1 = a.correct;
        int value2 = b.correct;

        // compare the total correct first
        if (value1 < value2) return 1;
        if (value1 > value2) return -1;

        // total correct is the same, sort on deltas (closest without going over)
        value1 = a.tiebreakerDelta;
        value2 = b.tiebreakerDelta;

        // returning -1 says "put value1 higher in the list than value2" 
        // (higher means closer to the 0 element of the sorted array) 
        if (value1 == 0) return -1; // a zero is higher than anything! 
        if (value2 == 0) return 1; // ditto, for the other arg, if val1 isn't zero 
        if (value1 == value2) return 0; // after that, if they are the same, say so 
        // if both are negative, then the larger one goes higher 
        if (value1 < 0 && value2 < 0) return (value1 > value2) ? -1 : 1;
        // if only one is negative, it goes higher 
        if (value1 < 0) return -1;
        if (value2 < 0) return 1;
        // finally, if both are postitive, lower one goes higher 
        return (value1 > value2) ? 1 : -1;
    }
很遗憾,断点对我没有帮助

编辑:以下是ResultsLineViewModel实现IFoolsorTable界面的一个简短示例:

List<ResultsLineViewModel> ls = new List<ResultsLineViewModel>();
        ResultsLineViewModel line1 = new ResultsLineViewModel();
        line1.correct = 10;
        line1.tiebreakerDelta = 0;
        ls.Add(line1);

        ResultsLineViewModel line2 = new ResultsLineViewModel();
        line2.correct = 10;
        line2.tiebreakerDelta = 2;
        ls.Add(line2);

        ResultsLineViewModel line3 = new ResultsLineViewModel();
        line3.correct = 10;
        line3.tiebreakerDelta = -3;
        ls.Add(line3);

        ResultsLineViewModel line4 = new ResultsLineViewModel();
        line4.correct = 9;
        line4.tiebreakerDelta = 0;
        ls.Add(line4);

        ls.Sort(new FoolsSort());
List ls=new List();
ResultsLineViewModel line1=新的ResultsLineViewModel();
line1.correct=10;
line1.tiebreakerDelta=0;
ls.添加(第1行);
ResultsLineViewModel line2=新的ResultsLineViewModel();
line2.correct=10;
line2.tiebreakerDelta=2;
ls.添加(第2行);
ResultsLineViewModel line3=新的ResultsLineViewModel();
第3行。正确=10;
line3.tiebreakerDelta=-3;
ls.添加(第3行);
ResultsLineViewModel line4=新的ResultsLineViewModel();
行4.correct=9;
line4.tiebreakerDelta=0;
ls.添加(第4行);
ls.Sort(new-woulssort());

正确的排序是:第1行、第3行、第2行、第4行

如果
a
大于
b
,则
比较(a,b)
应返回1,而
比较(b,a)
应返回-1。如果您有
a.correct=b.correct
,并且
a.tiebreakerDelta=0
b.tiebreakerDelta=0
,那么这将与
Compare
方法不一致,因为您希望保留操作顺序

据我所知,你应该先这样做

if (value1 == value2) return 0; // after that, if they are the same, say so
然后这个:

if (value1 == 0) return -1; // a zero is higher than anything! 
if (value2 == 0) return 1; // ditto, for the other arg, if val1 isn't zero 

还要注意,您的逻辑是相反的,如果第一个大于第二个,则应该返回1,而不是-1。例如,检查此

空引用异常是否有与之关联的行号?如果
a.tiebreakerDelta
b.tiebreakerDelta
都是0,则您将返回-1而不是0(如果(value1==value2)返回0,则该行
将永远不会执行)。不知道这是否是您的空问题的原因,但这似乎是不一致的。不确定您正在寻求什么样的帮助。。。只要在方法的开头放一个带条件的断点(a==null | | b==null),看看为什么用null调用它……如果你能给出一个简短但完整的失败例子,这将非常有帮助。底部关于Delta的整个部分可以简单得多。我有一种感觉,这里可能会出现一些错误,因为你按照特定的顺序一个接一个地测试一个值。如果您想测试哪一个更接近于0,您可以
Math.Abs()
两者,然后只测试哪一个更大。但是,知道空值出现的位置会有很大帮助。Nick-非常感谢,按照您指定的方式重新修改订单似乎已经纠正了问题!如果你不介意的话,你能详细解释一下第一段吗?我想真正理解为什么与最初的bug相比,这是可行的。正如你所看到的,第一段代码的问题是,当你有两个具有相同正确属性的项时,当两个TiebarkerDelta属性都为0时,然后调用Compare(val1,val2)将返回(根据您的代码)-1,如果您使用这些相同的实例调用Compare,比如Compare(val2,val1),您将再次得到-1,这不是它应该如何工作的。假设您正在调用Compare(1,2),它返回-1,当您调用Compare(2,1)时,它再次返回-1。那么就没有什么可比较的了,它们的顺序比它们的价值更重要,你根本不应该排序。现在对我来说完全有意义了,再次感谢——一旦你解释了,我觉得这很明显。干杯。除此之外,sort似乎正在将一个项目与其自身进行比较,比如比较(a,a),它应该返回0而不是-1。这就是为什么你得到了例外。
if (value1 == 0) return -1; // a zero is higher than anything! 
if (value2 == 0) return 1; // ditto, for the other arg, if val1 isn't zero