我想要做這樣的事情:我可以使用整數運算符來整合CompareTo嗎?
public override int CompareTo (Foo rhs)
{
return Bar.CompareTo(rhs.Bar) ??
Baz.CompareTo(rhs.Baz) ??
Fuz.CompareTo(rhs.Fuz) ?? 0;
}
這並不書面工作;有沒有一些最小的解決方法,使其工作?基本上我想0連鎖,直到非零(或鏈的結束)。
我想要做這樣的事情:我可以使用整數運算符來整合CompareTo嗎?
public override int CompareTo (Foo rhs)
{
return Bar.CompareTo(rhs.Bar) ??
Baz.CompareTo(rhs.Baz) ??
Fuz.CompareTo(rhs.Fuz) ?? 0;
}
這並不書面工作;有沒有一些最小的解決方法,使其工作?基本上我想0連鎖,直到非零(或鏈的結束)。
由語言不支持。但你可以寫一個這樣的小幫手:
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);
}
沒有基本的,但它會很好,如果它(IIRC,Jon在深度中提到了類似的想法在C#中)。你也許可以連鎖條件語句,但我傾向於只使用:
int delta = Bar.CompareTo(rhs.Bar);
if(delta == 0) delta = Baz.CompareTo(rhs.Baz);
if(delta == 0) delta = Fuz.CompareTo(rhs.Fuz);
return delta;
不是真的,??
僅適用於空值(引用類型或可空結構)
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;
如果不需要短路,你可以做一些二進制算術。 It is not required that the Compare results must be -1, 0, or 1, but that they must be < 0, = 0, > 0。因此,通過使用2^n作爲係數,其中n是優先級,您可以總結CompareTo結果,並根據需要獲取數字> 0或< 0。
因此,使用
return 4 * Bar.CompareTo(rhs.Bar)
+ 2 * Baz.CompareTo(rhs.Baz)
+ 1 * Fuz.CompareTo(rhs.Fuz);
我不知道回答你的問題,但如果三個值可以用來確定返回值,你可能要考慮重新設計你的類。 –
@DJ'CompareTo'與排序有關;這實際上很常見 - 例如按Surname排序 - 如果相同,則按FirstName排序,然後如果仍然相等,則按某個唯一標識符(例如數據庫ID)排序。 –
@Marc有趣的是,我之前沒有接觸過這個。我看到CompareTo是IComparable類的一部分。我將不得不閱讀更多以獲得一些觀點。謝謝 –