6

私はこのようなことをしたい:

public override int CompareTo (Foo rhs)
{
    return Bar.CompareTo(rhs.Bar) ??
           Baz.CompareTo(rhs.Baz) ??
           Fuz.CompareTo(rhs.Fuz) ?? 0;
}

これは書かれているとおりには機能しません。それを機能させるための最小限の回避策はありますか?基本的に、ゼロ以外 (またはチェーンの終わり) まで 0 をチェーンする必要があります。

4

5 に答える 5

2

言語ではサポートされていません。しかし、あなたはこのような小さなヘルパーを書くことができます:

public override int CompareTo (Foo rhs)
{
    return FirstNonZeroValue(
        () => Bar.CompareTo(rhs.Bar), 
        () => Baz.CompareTo(rhs.Baz),
        () => Fuz.CompareTo(rhs.Fuz));
}

private int FirstNonZeroValue(params Func<int>[] comparisons)
{
    return comparisons.Select(x => x()).FirstOrDefault(x => x != 0);
}
于 2011-10-24T20:16:22.690 に答える
2

基本的にはありませんが、あればいいのですが (IIRC、Jon は C# in Depth で同様のアイデアについて言及しました)。おそらくconditionalをチェーンすることができますが、私は単に使用する傾向があります:

int delta = Bar.CompareTo(rhs.Bar);
if(delta == 0) delta = Baz.CompareTo(rhs.Baz);
if(delta == 0) delta = Fuz.CompareTo(rhs.Fuz);
return delta;
于 2011-10-24T20:09:22.667 に答える
2

実際には、??null 値 (参照型または null 許容構造体) に対してのみ機能します。

int i;

i = Bar.CompareTo(rhs.Bar);
if (i != 0) return i;

i = Baz.CompareTo(rhs.Baz);
if (i != 0) return i;

i = Fuz.CompareTo(rhs.Fuz);
if (i != 0) return i;

return 0;
于 2011-10-24T20:09:26.077 に答える
0

短絡が必要ない場合は、バイナリ演算を実行できます。 Compare 結果が -1、0、または 1 である必要はありませんが、< 0、= 0、> 0 である必要があります。したがって、n が優先順位である係数として 2^n を使用することにより、CompareTo の結果を合計し、必要に応じて >0 または <0 の数値を得ることができます。

だから、使う

return 4 * Bar.CompareTo(rhs.Bar)
     + 2 * Baz.CompareTo(rhs.Baz)
     + 1 * Fuz.CompareTo(rhs.Fuz);
于 2016-08-24T20:39:05.387 に答える