C# 使用IComparable。不使用幻数进行比较
我真的很讨厌使用-直到今天,在使用.Net多年之后,我仍然经常被那些1和-1弄糊涂 我是否可以用一些自解释的名称替换结果值,而不必在每次调用后将输出整数转换为其他名称 我试图定义如下所示的枚举:C# 使用IComparable。不使用幻数进行比较,c#,.net,coding-style,code-readability,base-class-library,C#,.net,Coding Style,Code Readability,Base Class Library,我真的很讨厌使用-直到今天,在使用.Net多年之后,我仍然经常被那些1和-1弄糊涂 我是否可以用一些自解释的名称替换结果值,而不必在每次调用后将输出整数转换为其他名称 我试图定义如下所示的枚举: public enum ComparerResult { ALessThanB = -1, Equal = 0, AGreaterThanB = 1 } if(comparer.Compare(a, b) == ComparerResult.ALessThanB) 但是,如果
public enum ComparerResult
{
ALessThanB = -1,
Equal = 0,
AGreaterThanB = 1
}
if(comparer.Compare(a, b) == ComparerResult.ALessThanB)
但是,如果没有强制转换,这当然无法编译
这当然也适用于
谢谢你的想法创建常量怎么样?这样,您就不必从枚举强制转换
public class CompareHelper
{
public const int ALessThanB = -1;
public const int Equal = 0;
public const int AGreaterThanB = 1;
}
我更喜欢这种表达方式,而不是:
if (comparer.Compare(a, b) < 0)
if(比较器比较(a,b)<0)
这是一个很好的助记符,因为在两个操作数之间使用相同的运算符与零进行比较
正如Reddog在评论中提醒我的那样,接口规范并不特别要求-1和-1;它只需要消极和积极的结果。因此,您当前使用的逻辑不能保证在所有情况下都有效。关于
IComparable
和icomparaler
的扩展方法如何
public static class IComparableExtension
{
public static ComparerResult NiceCompareTo(this IComparable a, IComparable b)
{
int result = a.CompareTo(b);
if (result > 0) return ComparerResult.ALessThanB;
if (result < 0) return ComparerResult.AGreaterThanB;
return ComparerResult.Equal;
}
}
public static class IComparerExtension
{
public static ComparerResult NiceCompare(this IComparer c, IComparable a, IComparable b)
{
int result = c.Compare(a, b);
if (result > 0) return ComparerResult.ALessThanB;
if (result < 0) return ComparerResult.AGreaterThanB;
return ComparerResult.Equal;
}
}
公共静态类IComparableExtension
{
公共静态比较结果NiceCompareTo(此IComparable a,IComparable b)
{
int结果=a.与(b)相比;
如果(结果>0),则返回ComparerResult.alesthanb;
if(result<0)返回ComparerResult.agreaterhanb;
返回ComparerResult.Equal;
}
}
公共静态类IComparerExtension
{
公共静态比较结果NiceCompare(此IComparer c、IComparable a、IComparable b)
{
int result=c.比较(a,b);
如果(结果>0),则返回ComparerResult.alesthanb;
if(result<0)返回ComparerResult.agreaterhanb;
返回ComparerResult.Equal;
}
}
使用常量是危险的。for IComparer.Compare仅指定如果x
,则返回值应为“小于零”,如果x>y
,则返回值应为“大于零”。因此,您不应该假设返回值是[-1,0,1]中的一个
我的建议是在IComparer上创建一个扩展方法,为您完成这项工作
static MyCompare(this IComparable self, object x, object y)
{
var result = self.Compare(x, y);
if(result < 0) return ComparerResult.ALessthanB;
if(result == 0) return ComparerResult.Equal;
return ComparerResult.AGreaterThanB;
}
静态MyCompare(此IComparable self,对象x,对象y)
{
var结果=自我比较(x,y);
if(result<0)返回ComparerResult.alesthanb;
if(result==0)返回ComparerResult.Equal;
返回ComparerResult.agreerthanb;
}
这也很好,因为返回的值不一定是-1、0或1。它只能小于零、零或大于零。@Reddog,事实上,是的,我刚刚检查了方法的规范,但它不保证它会返回-1或1。