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

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

13.12.2011, 21:38. Показов 5151. Ответов 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
Ответы с готовыми решениями:

Оператор += не может применяться к операндам типа
Здравствуйте. Подскажите пожалуйста,почему получаю ошибку: Оператор += не может применяться к...

Оператор вида “>” не может применяться к операндам типа <T> и <T>
Добрый день, есть такой вот код class MyArr&lt;T&gt; { private T arr; ...

Оператор ^ не может применяться к операндам типа Double
g = e^(z)- Math.Abs(b);// опертор ^ не может применятся к операндаам типа Double как это решить?

Оператор && не может применяться к операндам типа string и int
Оператор &amp;&amp; не может применяться к операндам типа string и string string a, b, c, d; ...

Оператор "==" не может применяться к операндам одинакового типа
Ошибка: Ничего не понимаю O_o P.S. TestStruct - структура, содержащая один int и один...

5
112 / 112 / 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
17437 / 12829 / 3361
Регистрация: 17.09.2011
Сообщений: 21,107
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
112 / 112 / 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
17437 / 12829 / 3361
Регистрация: 17.09.2011
Сообщений: 21,107
13.12.2011, 23:52 6
Цитата Сообщение от Prorok Посмотреть сообщение
если так, то может быть в первой строчке надо where T : IComparer <T> вместо where T : IComparable<T>?
Нет, так делать не стоит. Мы же не коллекцию сравнивальщиков создаем, а коллекцию сравниваемых объектов.
То есть тип Т должен быть не объектом, который реализует механизмы сравнивания двух других объектов, а служит аргументом для сравнивания.
Думаю, понятно выразился
2
13.12.2011, 23:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.12.2011, 23:52
Помогаю со студенческими работами здесь

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

Посимвольное сравнение: оператор "==" не может применяться к операндам типа string и char
Нужно найти есть ли в строке данный символ, написал, но вот студия выдает ошибку, что оператор &quot;==&quot;...

Ошибка: Оператор == не может применяться к операндам Т и Т
В стиле обобщенного программирования хотел сделать контейнеры вектора и связного списка. Для...

Оператор & не может применяться к операндам типа "bool" и "int"
Никак не могу исправить ошибку помогите пожалуйста!

Оператор "<" не может применяться к операндам типа "Tip_Element"
Написал универсальный класс. Точнее с начало написал обычный. Но потом пришлось переписывать...


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

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

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