Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
ZingZing
1 / 1 / 1
Регистрация: 13.12.2011
Сообщений: 40
1

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

13.12.2011, 21:38. Просмотров 2935. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
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...

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

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

5
Prorok
108 / 108 / 22
Регистрация: 26.12.2008
Сообщений: 166
13.12.2011, 22:12 2
компилятор ругается на то что не знает реализует ли твой тип Т оператор >, тут надо по другому идти, сравнение выполнять через
collection[j - 1].CompareTo(collection[i]), и добавить where T : IComparable<T> , такое ограничение чтобы тип Т реализовал CompareTo.
1
ZingZing
1 / 1 / 1
Регистрация: 13.12.2011
Сообщений: 40
13.12.2011, 22:20  [ТС] 3
Спасибо, большое ! Вроде бы работает ))
0
kolorotur
Эксперт .NET
11108 / 9053 / 2282
Регистрация: 17.09.2011
Сообщений: 15,593
Завершенные тесты: 1
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
Prorok
108 / 108 / 22
Регистрация: 26.12.2008
Сообщений: 166
13.12.2011, 23:20 5
если так, то может быть в первой строчке надо:
C#
1
where T :  IComparer <T >
вместо
C#
1
where T : IComparable<T>
?
0
kolorotur
Эксперт .NET
11108 / 9053 / 2282
Регистрация: 17.09.2011
Сообщений: 15,593
Завершенные тесты: 1
13.12.2011, 23:52 6
Цитата Сообщение от Prorok Посмотреть сообщение
если так, то может быть в первой строчке надо where T : IComparer <T> вместо where T : IComparable<T>?
Нет, так делать не стоит. Мы же не коллекцию сравнивальщиков создаем, а коллекцию сравниваемых объектов.
То есть тип Т должен быть не объектом, который реализует механизмы сравнивания двух других объектов, а служит аргументом для сравнивания.
Думаю, понятно выразился
2
13.12.2011, 23:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.12.2011, 23:52

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

Оператор "&&" не может применяться к операндам типа "bool" и "int"
В целом: пишу программу для поиска пути между объектами. Написал на C++, но там не нравится...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru