Иллюстрированный самоучитель по Architecture .NET

Сравнение объектов

Итак, мы подробно рассмотрели копирование объектов. Теперь рассмотрим сравнение объектов. Для сравнения объектов в .NET Framework используется интерфейс IComparable. В этом разделе мы в качестве примера воспользуемся интерфейсом IComparablе для сортировки массива.

Сортировка массива

В классе System::Array (Система::Массив) статический метод Sort (Сортировка) предназначен для сортировки массива. Программа ArrayName иллюстрирует применение этого метода к сортировке массива объектов Name (Имя), где класс Name (Имя) содержит просто строку. Приведем листинг основной программы:

//ArrayName.срр
_gc class ArrayName
// класс сборщика мусора ArrayName
{
public:
static void Main() {
Name *array[] = new Name*[5]; // Имя
array[0] = new Name("Michael"); // новое Имя ("Майкл")
array[1] = new Name("Charlie"); // новое Имя ("Чарли")
array[2] = new Name("Peter"); // новое Имя ("Питер")
array[3] = new Name("Dana"); // новое Имя ("Дана")
array[4] = new Name("Bob"); // новое Имя ("Боб")
if (dynamic_cast<IComparable *>(array[0])!= 0)
Array::Sort(array); else
Console::WriteLine(
"Name does not implement IComparable");
// (" Name (Имя) не реализует IComparable");
lEnumerator *pEnum = array › GetEnumerator();
while (pEnum › MoveNext())
{
Name *pName = // Имя
dynamic_cast<Name *>(pEnum › Current);
if (pName!= 0)
Console::WriteLine(pName);
}
}
};

Реализация IComparable

Для того чтобы можно было произвести сортировку, необходимо определить правила сравнения сортируемых объектов. Такие правила реализуются в методе CompareTo интерфейса IComparable. Поэтому, для того, чтобы иметь возможность сортировать массивы, содержащие данные определенного вами типа, необходимо реализовать интерфейс IComparable для этого типа данных.

_gc _interface IComparable
// сборщик мусора – IComparable
{
int CompareTo(Object* obj);
};

Приведем листинг реализации класса Name (Имя), включая и реализацию интерфейса IComparable:

_gc class Name: public IComparable
{
private: // частный
String *pText;
public:
Name(String *pText) // Имя
{
this › pText = pText;
}
_property String* get_Item()
{
return pText;
}
_property void set_Itern(String* pText)
{
this › pText = pText;
}
int CompareTo(Object *pOb]) // Объект
{
String *pSl = this › pText;
String *pS2 =
(dynamic_cast<Name *>(pObj)) › pText;
return String::Compare(pSl, pS2); // сравниваются имена
}
String *ToString()
{
return pText;
}
};

Результатом работы программы является упорядоченный по алфавиту список имен:

Bob // Боб
Charlie // Чарли
Dana // Дана
Michael // Майкл
Peter // Питер
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.