2

私はIComparerを扱うのが本当に嫌いです。何年も .Net を使ってきた今でも、1 と -1 でよく混乱します。

Compare呼び出しのたびに出力整数を別のものにキャストすることなく、 Compare結果値を自明の名前に置き換えることはできますか?

次のような列挙型を定義しようとしました:

public enum ComparerResult
{
    ALessThanB = -1,
    Equal = 0,
    AGreaterThanB = 1
}

if(comparer.Compare(a, b) == ComparerResult.ALessThanB)

しかし、もちろん、キャストなしではコンパイルできません。

もちろん、これはIComparable.CompareToにも当てはまります。

アイデアをありがとう

4

4 に答える 4

7

私は以下を表現するのが好きです:

if (comparer.Compare(a, b) < 0)

2 つのオペランド間で行う場合と同じ演算子をゼロとの比較に使用するため、これはニーモニックです。


Reddog がコメントで思い出させてくれたように、インターフェイスの仕様では特に -1 と 1 は必要ありません。必要なのは否定的な結果と肯定的な結果だけです。そのため、現在使用しているロジックがすべての場合に機能するとは限りません。

于 2012-01-17T19:40:29.207 に答える
2

定数を作成するだけではどうですか?そうすれば、列挙型からキャストする必要がなくなります。

public class CompareHelper
{
    public const int ALessThanB = -1;
    public const int Equal = 0;
    public const int AGreaterThanB = 1;
}
于 2012-01-17T19:37:31.780 に答える
2

IComparableとの拡張メソッドはIComparerどうですか?

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;
    }
}
于 2012-01-17T19:46:38.967 に答える
1

定数の使用は危険です。IComparer.Compareのドキュメントでは、戻り値が の場合は「0 未満」x < y、または の場合は「0 より大きい」とのみ指定されています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;
}
于 2012-01-17T19:52:34.687 に答える