Как я могу не объявлять, какой тип класса C#

#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> , спасибо, что указали на это