2017-04-09 57 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的方法。这就是为什么你得到这个错误信息。

相关问题