Общее расширение BubbleSort
1124 просмотра
3 ответа
public static T[] BubbleSort<T>(this T[] arr) where T : class
{
for (int i = 0; i < arr.Length; i++)
{
for (int j = 0; j < arr.Length-1; j++)
{
if (arr[j - 1] > arr[j])
swap(arr[j - 1], arr[j]);
}
}
}
Как я могу создать общий метод расширения пузырьковой сортировки? Есть ли способ справиться со сравнением здесь? Ошибка 1 Оператор '>' не может быть применен к операндам типа 'T' и 'T'
Автор: Kubi Источник Размещён: 12.11.2019 09:56Ответы (3)
10 плюса
Вы можете ограничить , T
чтобы , IComparable<T>
как это:
public static void BubbleSort<T>(this T[] arr) where T : IComparable<T>
{
for (int i = 0; i < arr.Length; i++)
{
for (int j = 0; j < arr.Length-1; j++)
{
if (arr[j].CompareTo(arr[j + 1]) > 0)
swap(arr[j], arr[j + 1]);
}
}
}
который имеет преимущество в том, что T также может иметь тип значения типа int
. Также вашей функции не нужно возвращать массив, так как он меняет this
массив.
2 плюса
Вы не можете использовать <
параметры типа. Так что вы могли бы использовать Comparer<T>.Default
.
Или вы можете просто добавить общее ограничение, которое требуется T
для реализации IComparable<T>
. Затем вы можете вызвать Compare
метод.
Кроме того, ваш j
цикл отключен на один. Вам нужно либо сравнить и поменять местами arr [j] и arr [j + 1], либо изменить нижнюю границу на, 1
а верхнюю наarr.Length
1 плюс
Несколько способов сделать это:
- Требовать T для реализации
IComparable<T>
и использованияCompareTo
метода для сравнения. - Добавьте второй параметр типа,
IComparer<T>
который реализует пользовательское сравнение. Затем вы будете использовать этот объект для сравнения ключей.
Вопросы из категории :
- c# Преобразовать десятичную в двойную?
- c# Как рассчитать чей-то возраст в C #?
- c# Как вы сортируете словарь по значению?
- c# В чем разница между int и Integer в Java и C #?
- c# Как создать новый экземпляр объекта из Типа
- c# Datatable против Dataset
- c# Setting Objects to Null/Nothing after use in .NET
- c# Конвертировать целые числа в записанные числа
- c# Почему я не могу иметь абстрактные статические методы в C #?
- c# Как я могу оценить код C # динамически?
- generics Почему в C # нельзя хранить объект List <string> в переменной List <object>
- generics Преобразование общего типа из строки
- generics Лучший способ проверить, является ли универсальный тип строкой? (С #)
- generics Есть ли ограничение, которое ограничивает мой общий метод численными типами?
- generics Каковы различия между «универсальными» типами в C ++ и Java?
- generics Приведение списка <int> в список <string> в .NET 2.0
- generics Удалить дубликаты из списка <T> в C #
- generics Console.WriteLine и общий список
- generics Создать экземпляр универсального типа в Java?
- generics Что хорошего в дженериках, зачем их использовать?