2011-10-24 100 views
5

我想要做這樣的事情:我可以使用整數運算符來整合CompareTo嗎?

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

這並不書面工作;有沒有一些最小的解決方法,使其工作?基本上我想0連鎖,直到非零(或鏈的結束)。

+0

我不知道回答你的問題,但如果三個值可以用來確定返回值,你可能要考慮重新設計你的類。 –

+0

@DJ'CompareTo'與排序有關;這實際上很常見 - 例如按Surname排序 - 如果相同,則按FirstName排序,然後如果仍然相等,則按某個唯一標識符(例如數據庫ID)排序。 –

+0

@Marc有趣的是,我之前沒有接觸過這個。我看到CompareTo是IComparable類的一部分。我將不得不閱讀更多以獲得一些觀點。謝謝 –

回答

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); 
} 
+0

呃。像這樣的解決方案說明了我們不能擁有全局功能是多麼糟糕。 –

+0

如果使用得太多,總是可以把它放在擴展功能中,等等。 – driis

+0

什麼擴展? INT32?這甚至有可能嗎? –

2

沒有基本的,但它會很好,如果它(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; 
2

不是真的,??僅適用於空值(引用類型或可空結構)

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; 
相關問題