2012-01-30 5 views
3

Я реализую общий PriorityQueue в C# как часть домашней работы. Элементы хранятся в массиве.Сравнение пользовательских типов

class PQueue<T> : IPQueue<T> 
{ 
    T[] items; 
    //.. 
} 

Как сравнить два элемента. Я предполагаю, что тип, с которым создается экземпляр PQueue, должен реализовать IComparable/IComparer. Если да, то как я могу сравнить два элемента в items?

Каков элегантный способ его создания.

ответ

3

Во-первых, вам нужно сказать C#, что <T> реализует IComparable<T>

class PQueue<T> : IPQueue<T> where T : IComparable<T> { 
    T[] items; 
    //.. 
} 

Теперь вы можете сравнить отдельные элементы, например:

var cmp = items[i].CompareTo(items[j]); 
if (cmp < 0) { 
    // items[i] is less than items[j] 
} else if (cmp > 0) { 
    // items[i] is greater than items[j] 
} else { 
    // Items are equal 
} 
+0

Любопытно узнать, что произойдет, если я не укажу 'где T: IComparable ' – Nemo

+2

@Nemo Без ограничения компилятор скажет вам, что 'items [i]' не имеет метода, называемого 'CompareTo'. – dasblinkenlight

1

Вы, вероятно, ищет generic constraints, которые позволяют указать что T должен осуществить IComparable:

class PQueue<T> : IPQueue<T> where T : IComparable<T> 
{ 
    // ... 
} 
0

Во-первых, ваш пользовательский тип (T) должна иметь порядок сортировки

Либо T является встроенный в тип номера, как INT, двойной и т.д., что есть «естественный» порядок сортировки; или вы должны определить/закодировать его в свой собственный класс.

Возможно, существует некоторое свойство класса или комбинация свойств, которые являются одним из встроенных типов, которые вы можете использовать для определения порядка сортировки для своего пользовательского класса.

Алфавитные символы имеют «естественный» порядок сортировки. Имейте в виду, что порядок сортировки верхних регистров данной буквы не является последовательным. Когда дело доходит до строк, если верхний/нижний регистр не является существенным (для сортировки), то перед сравнением преобразовать строки в нижние (или верхние, на самом деле не имеющие значения).

Любые перечисления, которые вы пишете, имеют порядок сортировки, потому что они являются фундаментальными целыми числами.

CompareTo() определяет порядок сортировки для пользовательского класса

This method является «каучук встречает дороги» черновой код, который решает порядок два сравниваемых объектов. Как работает, это то, что вам нужно.

Об IPQueues класса

массив в качестве внутренней коллекции не кажется хорошей идеей, так как размер массива фиксируется. .NET имеет Queue class; может ли это работать на вас?

Смежные вопросы