如何在C#中将数组作为参数传递给未知类型?

时间:2019-02-27 13:39:25

标签: c# arrays sorting

我想对整数或双精度数组进行排序。为此,我想使用一种方法。我的问题是我不知道如何传递具有未知类型的数组作为参数。 我尝试过了

public static void BubbleSort<T>(T[] arr)
    {
        for (int i = 0; i < arr.Length; i++)
        {
            for (int j = 0; j < arr.Length - 1; j++)
            {
                //Can't use greater than because of T
                if (arr[j] > arr[j + 1])
                {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
    }

但是现在我不能使用大于运算符,因为该数组也可以是字符串数组。

3 个答案:

答案 0 :(得分:7)

您可以添加一个约束:

public static void BubbleSort<T>(T[] arr)
    where T : IComparable<T>
{
   ...
}

然后CompareTo方法将可用:

if (arr[j].CompareTo(arr[j + 1]) > 0)

答案 1 :(得分:0)

简而言之,我不会尝试自己进行排序。框架内部对此有支持。

https://docs.microsoft.com/en-us/dotnet/api/system.array.sort?view=netframework-4.7.2

除非这是一项家庭作业或技术面试,否则没有什么理由可以实现自己的自我。

答案 2 :(得分:0)

比较时,可以选择IComparer<T>

public static void BubbleSort<T>(T[] arr, IComparer<T> comparer = null) {
  if (null == arr)
    throw new ArgumentNullException(nameof(arr));

  // If comparer is not provided, let's (try to) use default one   
  if (null == comparer && typeof(IComparable<T>).IsAssignableFrom(typeof(T)))
    comparer = Comparer<T>.Default;
  else
    throw new ArgumentNullException(
       nameof(comparer), 
     $"Type {typeof(T)} doesn't have reasonable default comparer.");

  for (int i = 0; i < arr.Length; i++) {
    for (int j = 0; j < arr.Length - 1; j++) {
      // Can't use greater than because of T: but can comparer.Compare
      if (comparer.Compare(arr[j], arr[j + 1]) > 0) {
        T temp = arr[j];
        arr[j] = arr[j + 1];
        arr[j + 1] = temp;
      }
    }
  }
}

现在我们可以排序

  int[] ints = ...

  // integer array (default comparer)
  BubbleSort(ints); 

  int[] doubles = ...

  // double array (default comparer)
  BubbleSort(doubles); 

  // button array with custom comparer (sort by buttons' names)
  Button[] buttons = ...;

  BubbleSort(data, 
    Comparer<Button>.Create((left, right) => string.Compare(left?.Text, right?.Text)));