我想对整数或双精度数组进行排序。为此,我想使用一种方法。我的问题是我不知道如何传递具有未知类型的数组作为参数。 我尝试过了
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;
}
}
}
}
但是现在我不能使用大于运算符,因为该数组也可以是字符串数组。
答案 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)));