В среде .NET Framework предусмотрена возможность создания специализированных коллекций, которые оптимизированы для работы с конкретными типами данных или для особого вида обработки.
Эти классы коллекций (они определены в пространстве имен System.Collections.Specialized):
Специализированная коллекция | Описание |
CollectionsUtil | Коллекция, в которой игнорируется различия между строчным и прописным написанием символов в строках |
HybridDictionary | Коллекция, в которой для хранения небольшого числа пар ключ/значение используется класс ListDictionary. Но при превышении коллекцией определеного размера для хранения: элементов автоматически используется класс Hashtable |
ListDictionary | Коллекция, в которой для хранения пар ключ/значение используется связный список. Такую коллекцию рекомендуется использовать лишь при небольшом количестве элементов |
NameValueCollection | Отсортированная коллекция пар ключ/значение, в которой как ключ, так и значение имеют тип string |
StringCollection | Коллекция, оптимизированная для хранения строк |
StringDictionary | Хеш-таблица, предназначенная для хранения пар ключ/значение, в которой как ключ, так и значение имеют тип string |
В пространстве имен System.Collections также определены три абстрактных базовых класса, CollectionBase, ReadOnlyCollectionBase и DictionaryBase, которые предполагают создание производных классов и предназначены для использования в качестве отправной точки при разработке программистом собственных специализированных классов.
Способы сортировки объектов коллекции
Реализация интерфейса IComparable
Если необходимо отсортировать динамический массив (типа ArrayList) объектов, определенных пользователем (или, если вам понадобится сохранить эти объекты в коллекции типа SortedList), то вы должны сообщить коллекции информацию о том, как сравнивать эти объекты.
Один из способов — реализовать интерфейс IComparable.
В этом интерфейсе определен только один метод CompareTo(), который позволяет определить, как должно выполняться сравнение объектов соответствующего типа. Общий формат использования метода CompareTo() таков:
int CompareTo (object obj)
Метод CompareTo() сравнивает вызывающий объект с объектом, заданным параметром obj. Чтобы отсортировать объекты коллекции в возрастающем порядке, этот метод (в вашей реализации) должен возвращать нуль, если сравниваемые объекты равны положительное значение, если вызывающий объект больше объекта obj, и отрицательное число, если вызывающий объект меньше объекта obj.
Для сортировки в убывающем порядке достаточно инвертировать результат описанного сравнения. Метод CompareTo() может сгенерировать исключение типа ArgumentException, если тип объекта obj несовместим с вызывающим объектом.
//Реализация интерфейса IComparable.
using System;
using System.Collections;
Class Inventory : IComparable
{
string name;
double cost;
int onhand;
public Inventory(string n, double c, int h)
{
name = n;
cost = c;
onhand = h;
}
public override string ToString()
{
return String.Format("{0, -16}Цена: {1,8:C} В наличии: {2}",
name, cost, onhand);
}
// Реализуем интерфейс IComparable.
public int CompareTo(object obj)
{
Inventory b;
b = (Inventory)obj;
return this.name.CompareTo(b.name);
}
}
Class IcomparableDemo
{
public static void Main()
{
ArrayList inv = new ArrayList();
inv.Add(new Inventory("Плоскогубцы", 5.95, 3));
inv.Add(new Inventory("Гаечные ключи", 8.29, 2));
inv.Add(new Inventory("Молотки", 3.50, 4));
Console.WriteLine("---Информация до сортировки:");
foreach (Inventory i in inv)
Console.WriteLine(" " + i);
// Сортируем список.
inv.Sort();
Console.WriteLine("---Информация после сортировки:");
foreach (Inventory i in inv)
Console.WriteLine(" " + i);
}
}
Здесь метод сортировки предоставил исходный класс Inventory.
А как быть, если класс не реализует интерфейс IComparable?
В этом случае можно воспользоваться интерфейсом IComparer.
Дата: 2019-02-02, просмотров: 269.