C# 使用IComparable。不使用幻数进行比较

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) 但是,如果

我真的很讨厌使用-直到今天,在使用.Net多年之后,我仍然经常被那些1和-1弄糊涂

我是否可以用一些自解释的名称替换结果值,而不必在每次调用后将输出整数转换为其他名称

我试图定义如下所示的枚举:

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。