#c# #class #input #types #constructor
#c# #класс #ввод #типы #constructor
Вопрос:
Я создал класс для реализации алгоритма быстрой сортировки в массиве.Это конструктор и переменные класса :
public class QuickSort
{
int[] numbers;
public QuickSort(int[] input) {
numbers = input;
Console.WriteLine("QuickSort created!");
}
Но я хочу использовать его для массивов других типов, таких как float.
Как я могу объявить класс, чтобы он мог принимать в качестве входных данных массив любого типа?
Спасибо
Комментарии:
1. Вы смотрели на дженерики? msdn.microsoft.com/en-us/library/ms379564 (v = против 80).aspx
Ответ №1:
Этот вопрос сложнее, чем кажется.
Во-первых, здесь уже есть два ответа, в которых говорится об использовании дженериков.
Для данного примера кода они на 100% верны, используйте generics.
Но это само по себе не даст вам ответа на то, как действовать дальше.
Во-первых, использование generics даст вам возможность написать класс или метод быстрой сортировки, который будет принимать значения любого типа.
Однако это не обязательно подскажет вам, как на самом деле выполнять сортировку, когда ваш метод сортировки может принимать значения любого типа.
Вот как я бы объявил материал из вашего вопроса:
public class Quicksort
{
public void Sort<T>(IList<T> collection)
where T : IComparable<T>
{
...
}
}
Без публикации фактической реализации метода быстрой сортировки преимущества были бы:
- Может принимать значения любого типа, как
T
- При условии
T
, чтоT
знает, как сравнивать себя с другимиwhere T : IComparable<T>
‘ами (‘а), что означает, что если вы сортируете int, любой один int может сказать вам, идет ли он до или после, или такой же, как любой другой int. - Взятие
IList<T>
означает, что вы можете взять любой предварительно индексируемый тип коллекцииT
‘s. Быстрая сортировка обычно основывается на возможности знать, сколько элементов в коллекции для сортировки, иIList<T>
это наименьший тип в .NET collection world, который может это сделать (если вы не ограничиваетеIList
, не универсальный интерфейс).
Вопросы, на которые только вы знаете ответ:
- Почему вы создали
numbers
переменную экземпляраQuickSort
? Зачем вам вообще нужны переменные экземпляра?
Комментарии:
1. Переменная экземпляра не нужна, вы правы. Срок действия вашего решения истекает, и я надеюсь, что смогу делать то, что хочу. Спасибо за ваше время
Ответ №2:
Вы можете использовать дженерики:
public class QuickSort<T>
{
T[] numbers;
public QuickSort(T[] input) {
numbers = input;
Console.WriteLine("QuickSort created!");
}
Ответ №3:
Используйте дженерики:
public class QuickSort<T> where T : IComparable<T>
Вам придется использовать IComparable<T>
интерфейс вместо операторов сравнения для ваших целей сортировки.
Или просто:
public class QuickSort<T>
Но тогда вам придется использовать IComparer<T>
в алгоритме. Вы можете получить значение по умолчанию для type T
с: Comparer<T>.Default
В любом случае, стандартные операторы сравнения ( <
, >
и т.д.) Не будут работать с универсальным типом.
Комментарии:
1. Вы должны изменить
where T : IComparable
наwhere T : IComparable<T>
. Нет необходимости использовать не универсальныйIComparable
интерфейс начиная с .NET 2 (2005).2. Да, это то, что я имел в виду на самом деле, но я забыл
<T>
, спасибо, что указали на это