Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основы C#.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
609.28 Кб
Скачать

Основы c#. Урок 65. Класс Stack

Класс Stack предназначен для хранения некоторых данных произвольного типа. Он находится в пространстве имен System.Collections.

Основной принцип действия этого класса - "первый вошел, последний вышел".

Вот пример использования этого класса:

// Создаем класс для добавления его экземпляров в стек.

class DataClass

{

public int a;

public int b;

public DataClass(int a, int b)

{

this.a = a;

this.b = b;

}

public override string ToString()

{

return "a = " + a + ", b = " + b;

}

}

Теперь займемся непосредственно стеком.

// Добавляем данные в стек.

Stack st = new Stack();

DataClass q = new DataClass(2, 3);

st.Push(q);

q = new DataClass(10, 100);

st.Push(q);

// Смотрим последние добавленные данные (без удаления их из стека).

DataClass t = (DataClass)st.Peek();

Console.WriteLine(t);

Console.WriteLine("Count: " + st.Count);

Console.WriteLine();

// Извлекаем последние добавленные данные (с удалением их из стека).

t = (DataClass)st.Pop();

Console.WriteLine(t);

Console.WriteLine("Count: " + st.Count);

Console.WriteLine();

t = (DataClass)st.Pop();

Console.WriteLine(t);

Console.WriteLine("Count: " + st.Count);

Console.WriteLine();

Пример достаточно ясен из комментариев.

Класс Stack позволет обойти все свои элементы. Это можно сделать, например, вот так:

foreach (DataClass d in st)

{

Console.WriteLine(d.ToString());

}

Обратите внимание, на то, что тип данных в стеке не определен (вернее, в стеке хранятся данные типа Object). Поэтому мы везде вынуждены делать приведение типов.

Из других полезных методов и свойств следует отметить еще Clear (очищает весь стек), Contains (позволяет определить, содержит ли наш стек какой-нибудь элемент), ToArray (возвращает массив, состоящий из элементов стека).

Основы c#. Урок 66. Класс SortedList

Класс SortedList предназначен для создания коллекции, элементы которых располагаются сразу в отсортированном по ключу виде. Доступ к элементам SortedList мы можем осуществлять двумя способами - через ключ (как в IDictionary), так и через его номер (как в массивах, например. Но, в отличие от массивов, мы используем не квадратные скобки, а некоторый метод).

Класс SortedList реализует интерфейсы IDictionary и ICloneable и подобно другим классам коллекций расположен в пространстве имен System.Collections.

Рассмотрим работу с основнями методами и свойствами этого класса на примере:

static void Main(string[] args)

{

SortedList sl = new SortedList();

// Добавление элементов.

sl.Add("USA", "Washington");

sl.Add("France", "Paris");

sl.Add("Germany", "Berlin");

// Показ всех элементов.

ShowAll(sl);

// Показываем нулевой элемент (Paris).

Console.WriteLine("sl[0]: {0}", sl.GetByIndex(0));

sl.Add("Denmark", "Copenhagen");

// Показываем нулевой элемент (Copenhagen).

Console.WriteLine("sl[0]: {0}", sl.GetByIndex(0));

// Выясняем, существуют ли определенные ключ и значение.

if (sl.ContainsKey("France"))

Console.WriteLine("There is France key");

else

Console.WriteLine("There is no France key");

if (sl.ContainsValue("Copenhagen"))

Console.WriteLine("There is Copenhagen value");

else

Console.WriteLine("There is no Copenhagen value");

// Поиск индекса ключа и значения.

// -1 - если ничего не найдено.

int keyNum = sl.IndexOfKey("France");

Console.WriteLine("Index of France: {0}", keyNum);

int keyValue = sl.IndexOfValue("Lisbon");

Console.WriteLine("Index of Lisbon: {0}", keyValue);

// Удаление элемента по ключу.

Console.WriteLine("France will be removed.");

sl.Remove("France");

ShowAll(sl);

// Удаление элемента по номеру.

Console.WriteLine("2nd element will be removed.");

sl.RemoveAt(2);

ShowAll(sl);

// Получаем все ключи и все значения.

Console.WriteLine("Keys:");

foreach (string key in sl.Keys) {

Console.WriteLine(key);

}

Console.WriteLine("Values:");

foreach (string key in sl.Values)

{

Console.WriteLine(key);

}

// Удаляем все элементы.

sl.Clear();

ShowAll(sl);

}

// Метод для показа всех элементов и их количества.

static void ShowAll(SortedList sl) {

Console.WriteLine("Count: {0}", sl.Count);

foreach (DictionaryEntry d in sl) {

Console.WriteLine("Key: {0}, Value: {1}", d.Key, d.Value);

}

}

Использование методов должно быть понятно из комментариев. Отметим, что большая часть методов стандартизована и встречается у всех коллекций - так все они реализуют интерфейс IDictionary.

Обратите внимание, что при выводе содержимого нашего SortedList его элементы показываются упорядоченнными по возрастанию ключей. И это несмотря на то, что добавляли их в другом порядке. Т. е. класс SortedList сортирует свое содержимое по значению ключей автоматически. Что не удивительно, так как класс называется SortedList. То, что элементы меняют свой порядок по мере добаления / удаления элементов, видно из следующего фрагмента:

// Показываем нулевой элемент (Paris).

Console.WriteLine("sl[0]: {0}", sl.GetByIndex(0));

sl.Add("Denmark", "Copenhagen");

// Показываем нулевой элемент (Copenhagen).

Console.WriteLine("sl[0]: {0}", sl.GetByIndex(0));

Сначала у нас нулевой элемент был один, а после простого добавления еще одного элемента в наш SortedList нулевой элемент изменился.

Вообще говоря автоматическая сортировка в классе SortedList связана некоторыми накладными расходами. Это значит, что если вам сортировка нужна только пару раз, то, быть может, лучше использовать другой класс (например, написанный вами).