代码之家  ›  专栏  ›  技术社区  ›  Ludovic C

C#Comparer.Default<short>。Compare和Comparer.Default<byte>不返回-1、0或1

  •  3
  • Ludovic C  · 技术社区  · 6 年前

    所有“数字”比较器(例如 Comparer.Default<int> Comparer.Default<long> 等)返回 -1 0 1 但是 Comparer.Default<short> Comparer.Default<byte> 将返回两个比较数字之间的差值吗?

    这是一个优化功能(返回的差异更快)和/或因为两个短字符或两个字节之间的可能差异将适合于 int Comparer<T>.Compare 退货类型)?但两者之间的区别是什么 ints Comparer<T>.Compare(int.MinValue, int.MaxValue) (例如)

    2 回复  |  直到 6 年前
        1
  •  2
  •   Mark Rotteveel    6 年前

    基于 comments in the code 后者是:

    // Need to use compare because subtraction will wrap
    // to positive for very large neg numbers, etc.
    

    例如,假设我们的实现与 short byte int :

    private int Compare(int x, int y)
    {
       return x - y;
    }
    

    现在 IComparer Compare 是:

    • 小于零,则x<Y
    • 大于零,则x>Y
    • 零,那么x==y;

    但是,考虑到上面的实现,如果我们传递一个足够大的负整数作为第一个参数,减法运算将溢出并换行为一个非常大的正数:

    Compare(Int32.MinValue, 1); // returns 2147483647
    

    Int32.MinValue 大于 1 .

    排序次序 定义如下:

    public int Compare (T x, T y);
    

    int ,只执行参数的减法是安全的 短的 字节 因为它永远不会引起 int 结果导致溢出。

        2
  •  0
  •   usr    6 年前

    我想你说得很对。整数差不适合整数,但字节差总是适合整数。

    Compare 仅指定与标志有关的事项。因此,返回 x y 对于较小的类型。

    如果您感兴趣:其他语言不一定遵循符号模型( < 0 , 0 , > 0 )一点也不。有些(如Haskell)返回一个包含三个可能值的枚举 Less, Equal, Greater . 这更干净,但速度较慢。