原语和IComparable接口

问题描述

在Java中,如果我想对任何与其数据类型无关的数据进行排序,我将使用Comparable接口,并且发现C#中具有类似的接口,因此我有简单的排序算法:

public static void Sort(IComparable[] arr)
{
    bool swap = true;
    while (swap)
    {
        swap = false;
        for (int i = 0; i < arr.Length - 1; i++)
        {
            if (Less(arr[i + 1],arr[i]))
            {
                Exchange(arr,i,i + 1);
                swap = true;
            }
        }
    }
} 

因此,我可以对实现IComparable接口的任何对象进行排序,但是我不能对任何原始数据类型进行排序,并且据我所知,C#没有像int-> Integer这样的基元的包装类型。像Int32这样的结构实际上实现了IComparable接口,但是由于某些原因我仍然不能使用它,例如:

static void Main(string[] args)
{
    Int32[] ints = { 5,2,9,3};
    BubbleSort.sort(ints);

    ReadKey();
}

我会得到一个错误

Error   CS1503  Argument 1: cannot convert from 'int[]' to 'System.IComparable[]'

但是,如果我们检查Int32的元数据,我们可以看到它实现了IComparable

code

所以

  1. 我不知道什么?
  2. 这是怎么了?
  3. 如何更好地对数据进行排序?

解决方法

int[]不是IComparable[],后者是引用数组。

但是有一个简单的解决方案,它可以避免装箱。将您的方法声明更改为泛型,并对类型参数施加约束:

public static void Sort<T>(IComparable<T>[] arr) where T : IComparable<T>

您可能还需要更改ExchangeLess方法-您尚未告诉我们它的外观。但是它们也可以(也许应该)是通用的。此时,Sort的方法主体无需更改。

,

如果有人感兴趣:

public static class BubbleSort<T>
{
        public static void Sort(T[] arr,Comparer<T> comparer = null)
        {
            Comparer<T> equaltyComparer = comparer ?? Comparer<T>.Default;

            bool swap = true;
            while (swap)
            {
                swap = false;
                for (int i = 0; i < arr.Length - 1; i++)
                {
                    if (Less(equaltyComparer,arr[i + 1],arr[i]))
                    {
                        Exchange(arr,i,i + 1);
                        swap = true;
                    }
                }
            }
        }
        
        private static bool Less(Comparer<T> comparer,T v,T w)
        {
            return  comparer.Compare(v,w) < 0;
        }

        private static void Exchange(T[] arr,int i,int j)
        {
            T temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...