C#覆盖IComparer接口的比较方法
我有一个类覆盖了IComarer类的Compare方法。 你能给我解释一下“返回v1v2.CompareTo(v2v1)*-1;”的代码部分吗? 这里代表什么?为什么我们要用1减去这个值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();
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的有效实现,我考虑过了,但没有写下来。谢谢你指出这一点。