2017-04-09 54 views
0

我想添加一個比較器的數據結構,像這樣:的Comparer創建lambda函數不能隱式轉換類型CS0029

private SortedSet<int> sortedScore = new SortedSet<int>(Comparer<int>.Create(
     (a, b) => a > b)); 

但我發現了:CS0029無法隱式轉換類型「布爾」到' INT」

這很奇怪,因爲a > b是一個布爾值,而不是一個int,甚至投不幫助,但如果我這樣做:

private SortedSet<int> sortedScore = new SortedSet<int>(Comparer<int>.Create(
     (a, b) => a.CompareTo(b))); 

我沒有得到任何錯誤,實際上,比任何其他第在給我和上面一樣的錯誤。那麼如何將比較器更改爲默認值以外的值?

回答

1

怎麼一回事,因爲一個IComparer<T>必須提供一種方法

int Compare(T x, T y) 

即它必須返回一個int,而不是bool

  • 如果a > b必須返回int > 0
  • 如果是a = b,它必須返回0
  • 它必須返回int < 0如果a < b

你的第二個例子使用a.CompareTo(b),它返回所需的int

如果你想實現自己的邏輯,你可以寫在lambda爲:

(a, b) => a > b ? +1 : a < b ? -1 : 0 
0

類型的數據結構是SortedSet<int>。所以你只能使用的比較器應該實現IComparer<int>接口。該接口有一個稱爲Compare具有以下簽名方法:

int Compare(int x, int y) 

和兩個值xy比較並返回指示一個是否比另一個小於,等於,或更大的值。有關furhre的信息,請看看IComparer

這就是說你不能使用返回bool的方法。這就是爲什麼你得到這個錯誤信息。

相關問題