IComparer comp)

IComparer comp)

Void Sort(Array arrKeys, Array arrItems, IComparer comp)

Void Sort(Array агг, IComparer comp)

void Sort(Array агг, int iStartIndex, int iCount, IComparer comp)

void Sort(Array arrKeys, Array arrItems, int iStartIndex, iCount,

Аргумент типа IComparer может быть экземпляром любого класса, реализующего интерфейс ICompare. Класс String не является таким классом! В нем реализован интерфейс IComparable, а не IComparer. Интерфейс IComparer определен в пространстве имен System.Collections. В классе, реализующем IComparer, должен быть определен метод:

Метод интерфейса IComparer

int Compare(object obj1, object obj2)

Так как он нестатический, то не определен в классе String. (Единственный реализованный в классе String метод — Compare — статический.) Пространство имен System.Collections содержит два реализующих IComparer класса. Ими являются Comparer (для выполнения чувствительного к регистру сравнения, такого же. как по умолчанию) и CaseInsensitiveComparer (для нечувствительного к регистру сравнения). Оба содержат статический член Default, возвращающий экземпляр класса,

Например, для выполнения чувствительной к регистру сортировки строкового массива astr следует вызвать;

Array. Sort(astr);

Array. Sort (astr, Comparer, Default);

Чтобы выполнить нечувствительную к регистру сортировку, надо вызвать:

Array. Sort (astr, CaseInsensitiveComparer. Default);

Нечувствительное к регистру сравнение гораздо полезнее в методе BinarySearch (или при выполнении сортировки в рамках подготовки к двоичному поиску), чем в методе Sort:

Статический метод BinarySearch класса Array

int BinarySearch(Array аrr, object obj)

int BinarySearch(Array аrr, int iStartIndex, int iCount, object obj)

int BinarySearch(Array аrr, object obj, IComparer comp)

int BinarySearch(Array аrr, int iStartIndex, int iCount, object obj,

Для двоичного поиска массив должен быть предварительно отсортирован. Допустим, отсортированный массив из четырех строчек (названий штатов Америки) содержит элементы:

"New Hampshire", "New Jersey", "new Mexico", "New York"

Вызов:

Array.BinarySearch(astr, "New York")

возвращает З, поскольку строка совпадает с astr[3]. Вызов:

Агray.BinarySearch(astr, "New Mexico")

возвращает -А. Отрицательное значение указывает, что строка не содержится в массиве. ( сортировка по умолчанию чувствительна к регистру!) Дополнение к возвращаемому значению равно 3, т. с. astr[3] является следующим наибольшим элементом массива,

Вызов:

Array.BinarySearch(astr, "new Mexico"));

возвращает 2. так как аргумент совпадает с astr[2]. Вызов:

Array.BinarySearch(astr, "New Mexico", CaseInsensitiveComparer.Default));

выполняет нечувствительный к регистру поиск и также возвращает 2.

Класс StringBuilder

Иногда многократное создание объектов Siting влияет на производительность. Проанализируем приведенную далее программу, в которой большие строки создаются оператором += в 10 000 операций присоединения строк.

using System;