1 / 1 / 1
Регистрация: 13.12.2011
Сообщений: 40
1

Проблема при сравнении: "Оператор ">" не может применяться к операндам типа "Т" и "Т""

13.12.2011, 21:38. Показов 4800. Ответов 5
Метки нет (Все метки)

Добрый день , пишу сортировку , все делаю на основе Т , но вот в чем проблемма
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class BubbleSort<T>:ISortStrategy<T>
    {
        public void Sort(ref T[] collection)
        {
 
            for (int i = 0; i < collection.Length; i++)
            {
                for (int j = collection.Length - 1; j < i; j++)
                {
                    if ((collection[j - 1] > collection[i]))//Здесь ругаеться
                    {
                        T tmp = collection[i];
                        collection[i] = collection[j - 1];
                        collection[j - 1] = collection[i];
                    }
                }
            }
        }
    }
, коглда пишу строку сравнения if ((collection[j - 1] > collection[i])) , компилятор ругаеться , говорит мол
C#
1
Операто ">" не может применяться к операндам типа "Т" и "Т"
Подскажите пожалуйста как можно решить такую не приятную ситуацию ! Буду очень благодарен за совет !
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.12.2011, 21:38
Ответы с готовыми решениями:

Поиск в массиве. Ошибка "Оператор "&&" не может применяться к операндам типа "bool" и "double""
Найти номер последнего минимального элемента среди положительных четных элементов, лежащих правее...

При компиляции выскакивает ошибка "оператор == не может применяться к операндам типа "Т" и "Т"
Есть обобщённый метод public Boolean In(T element) { flag = false; foreach (T el in...

Консоль: Оператор "==" не может применяться к операндам типа "bool" и "int"
Ошибкa: Оператор &quot;==&quot; не может применяться к операндам типа &quot;bool&quot; и &quot;int&quot; Здесь: public void...

Оператор "==" не может применяться к операндам типа "char" и "string"
Пишу программу, подскажите как исправить данную ошибку for (int j = 0; j &lt; alfavit.Length; j++)...

5
111 / 111 / 22
Регистрация: 26.12.2008
Сообщений: 166
13.12.2011, 22:12 2
компилятор ругается на то что не знает реализует ли твой тип Т оператор >, тут надо по другому идти, сравнение выполнять через
collection[j - 1].CompareTo(collection[i]), и добавить where T : IComparable<T> , такое ограничение чтобы тип Т реализовал CompareTo.
1
1 / 1 / 1
Регистрация: 13.12.2011
Сообщений: 40
13.12.2011, 22:20  [ТС] 3
Спасибо, большое ! Вроде бы работает ))
0
Эксперт .NET
16370 / 12331 / 3237
Регистрация: 17.09.2011
Сообщений: 20,473
13.12.2011, 22:28 4
Цитата Сообщение от Prorok Посмотреть сообщение
collection[j - 1].CompareTo(collection[i])
Все-таки в реализации шаблонных классов для сравнения лучше использовать ссылку на IComparer<T>, так как если этого не сделать, то сначала придется делать проверку collection[j - 1] != null, а если в качестве типа T используется структура, то будет иметь место распаковка/запаковка, что нам совсем не нужно.
Лучше использовать примерно такой паттерн:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class BubbleSort<T> : ISortStrategy<T> where T : IComparable<T>
{
   private IComparer<T> comparer;
 
   public BubbleSort(IComparer<T> defaultComparer)
   {
      if (defaultComparer == null) throw new ArgumentNullException();
      comparer = defaultComparer;
   }
   public BubbleSort() : this(Comparer<T>.Default) { }
 
   public void Sort(T[] collection)  // ref тут не нужен
        {
            for (int i = 0; i < collection.Length; i++)
            {
                for (int j = collection.Length - 1; j < i; j++)
                {
                    if (comparer.Compare(collection[j - 1], collection[i]) > 0)
                    {
                        T tmp = collection[i];
                        collection[i] = collection[j - 1];
                        collection[j - 1] = collection[i];
                    }
                }
            }
        }
}
3
111 / 111 / 22
Регистрация: 26.12.2008
Сообщений: 166
13.12.2011, 23:20 5
если так, то может быть в первой строчке надо:
C#
1
where T :  IComparer <T >
вместо
C#
1
where T : IComparable<T>
?
0
Эксперт .NET
16370 / 12331 / 3237
Регистрация: 17.09.2011
Сообщений: 20,473
13.12.2011, 23:52 6
Цитата Сообщение от Prorok Посмотреть сообщение
если так, то может быть в первой строчке надо where T : IComparer <T> вместо where T : IComparable<T>?
Нет, так делать не стоит. Мы же не коллекцию сравнивальщиков создаем, а коллекцию сравниваемых объектов.
То есть тип Т должен быть не объектом, который реализует механизмы сравнивания двух других объектов, а служит аргументом для сравнивания.
Думаю, понятно выразился
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.12.2011, 23:52
Помогаю со студенческими работами здесь

Оператор ">=" не может применяться к операндам типа "bool" и "double"
Что не так? using System; class Hello { static void Main() { const double п...

Оператор "<<" не может применяться к операндам типа "uint" и "long"
Всем привет! переписываю программу с C++ на C#. есть несколько переменных: uint...

Оператор "||" не может применяться к операндам типа "string" и "char"
Есть что-то, типа, игры в &quot;Города&quot;. В фрагменте проверки последней буквы в слове пользователя...

Оператор "&&" не может применяться к операндам типа "bool" и "string"
Такая вот проблемка: &quot;Ошибка 1 Оператор &quot;&amp;&amp;&quot; не может применяться к операндам типа &quot;bool&quot; и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru