C#覆盖IComparer接口的比较方法

C#覆盖IComparer接口的比较方法,c#,return-value,asterisk,icomparer,C#,Return Value,Asterisk,Icomparer,我有一个类覆盖了IComarer类的Compare方法。 你能给我解释一下“返回v1v2.CompareTo(v2v1)*-1;”的代码部分吗? 这里代表什么?为什么我们要用1减去这个值 public class ValueComparator : System.Collections.IComparer { public int Compare(Object lhs, object rhs) { string v1 = lhs.ToString();

我有一个类覆盖了IComarer类的Compare方法。 你能给我解释一下“返回v1v2.CompareTo(v2v1)*-1;”的代码部分吗? 这里代表什么?为什么我们要用1减去这个值

public class ValueComparator : System.Collections.IComparer
{
    public int Compare(Object lhs, object rhs)
    {
        string v1 = lhs.ToString();
        string v2 = rhs.ToString();
        string v1v2 = v1 + v2;
        string v2v1 = v2 + v1;
        return v1v2.CompareTo(v2v1)*  -1;

    }
}

它从本质上扭转了这种对比。由于Compare通过将其乘以-1返回-1(小于)、0(等于)或1(大于),因此它会反转结果-1变为1,0保持为0,1变为-1


正如sstan所提到的,它可能应该写成
v2v1。而不是(v1v2)

*
不是减法,而是乘法。不知道它为什么这么做。它可以写成
v2v1。CompareTo(v1v2)
而不是乘法。它不是减法,而是将值反转。感谢Ron,这取决于v1v2和v2v1v1v2的值。CompareTo(v2v1)可能返回>0、0或返回-1或1的位并不完全准确。只需要一个负值或正值,不一定是-1或1。小小的疑虑,它不是
-1
0
1
它是
<0
0
-0
比较器返回
-275
0
600
,是完全合法的。这种更宽松的限制是有益的,因为您可以将
int Compare(int a,int b){return a-b;}
实现为简单的减法运算,而不需要涉及布尔逻辑。重要的是,这种实现被打破了,因为
int.MinValue*-1
仍然是
int.MinValue
@ScottChamberlain:“因为你可以实现
int-Compare(inta,intb){returna-b;}
”-除非你想引起溢出,否则你不应该这样做,但是对于小于
int
的范围类型,这是
Compare
@O.R.Mapper true的有效实现,我考虑过了,但没有写下来。谢谢你指出这一点。