Специализированные коллекции
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

В среде .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.