KnigaRead.com/
KnigaRead.com » Разная литература » Прочее » Герберт Шилдт - C# 4.0 полное руководство - 2011

Герберт Шилдт - C# 4.0 полное руководство - 2011

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн "Герберт Шилдт - C# 4.0 полное руководство - 2011". Жанр: Прочее издательство неизвестно, год неизвестен.
Перейти на страницу:

public void Sort(int index,

Сортирует вызывающую коллекцию, используя

int count, IComparer<T>

для сравнения способ, задаваемый параметром

comparer)

comparer. Сортировка начинается с элемента, указываемого по индексу index, и включает количество элементов, определяемых параметром count. Если параметр comparer имеет пустое значение, то для сравнения используется способ, выбираемый по умолчанию

public T [ ] ToArrayO

Возвращает массив, содержащий копии элементов вызывающего объекта

public void TrimExcess()

Сокращает емкость вызывающей коллекции таким образом, чтобы она не превышала 10% от количества элементов, хранящихся в ней на данный момент

В классе List<T> определяется также собственное свойство Capacity, помимо тех, что уже объявлены в интерфейсах, которые в нем реализуются. Это свойство объявляется следующим образом.

public int Capacity { get; set; }

Свойство Capacity позволяет установить и получить емкость вызывающей коллекции в качестве динамического массива. Эта емкость равна количеству элементов, которые может содержать коллекция до ее вынужденного расширения. Такая коллекция расширяется автоматически, и поэтому задавать ее емкость вручную необязательно. Но из соображений эффективности это иногда можно сделать, если заранее известно количество элементов коллекции. Благодаря этому исключаются издержки на выделение дополнительной памяти.

В классе List<T> реализуется также приведенный ниже индексатор, определенный в интерфейсе IList<T>.

public Т this[int index] { get; set; }

С помощью этого индексатора устанавливается и получается значение элемента коллекции, указываемое по индексу index.

В приведенном ниже примере программы демонстрируется применение класса List<T>. Это измененный вариант примера, демонстрировавшего ранее класс ArrayList. Единственное изменение, которое потребовалось для этого, заключалось в замене класса ArrayList классом List, а также в использовании параметров обобщенного типа.

// Продемонстрировать применение класса List<T>. using System;

using System.Collections.Generic;

class GenListDemo { static void Main() {

// Создать коллекцию в виде динамического массива.

List<char> 1st = new List<char>();

Console.WriteLine("Исходное количество элементов: " + lst.Count);

Console.WriteLine();

Console.WriteLine("Добавить 6 элементов");

// Добавить элементы в динамический массив.

1st.Add('С');

1st.Add(1А *);

1st.Add('Е');

1st.Add(1В1);

1st.Add('D');

1st.Add('F');

Console.WriteLine("Количество элементов: " + lst.Count);

// Отобразить содержимое динамического массива,

// используя индексирование массива.

Console.Write("Текущее содержимое: "); for (int i=0; i < lst.Count;. i++)

Console.Write(1st[i] + " ");

Console.WriteLine("n");

Console.WriteLine("Удалить 2 элемента ");

// Удалить элементы из динамического массива.

1st.Remove('F');

1st.Remove('А1);

Console.WriteLine("Количество элементов: " + lst.Count);

// Отобразить содержимое динамического массива, используя цикл foreach. Console.Write("Содержимое: "); foreach(char с in 1st)

Console.Write(с + " ");

Console.WriteLine("n");

Console.WriteLine("Добавить еще 20 элементов");

// Добавить количество элементов, достаточное для // принудительного расширения массива, for(int i=0; i < 20; i++)

1st.Add((char) ('a1 + i));

Console.WriteLine("Текущая емкость: " + 1st.Capacity);

Console.WriteLine("Количество элементов после добавления 20 новых: " + 1st.Count);

Console.Write("Содержимое: ");

foreach(char с in 1st)

Console.Write(с + " ") ;

Console.WriteLine("n");

// Изменить содержимое динамического массива,

//’ используя индексирование массива.

Console.WriteLine("Изменить три первых элемента"); 1st [0] = 1X'; lst[l] = ' Y' ;

1st[2] = 1Z1;

Console.Write("Содержимое: "); foreach(char с in 1st)

Console.Write(с + " ");

Console.WriteLine ();

// Следующая строка кода недопустима из-за // нарушения безопасности обобщенного типа.

// lst.Add(99); // Ошибка, поскольку это не тип char!

}

}

Эта версия программы дает такой же результат, как и предыдущая.

Исходное количество элементов: О

Добавить 6 элементов Количество элементов: 6 Текущее содержимое: С А Е В D F

Удалить 2 элемента Количество элементов: 4 Содержимое: С Е В D

Добавить еще 20 элементов Текущая емкость: 32

Количество элементов после добавления 20 новых: 24 Содержимое: CEBDabcdefghij klmnopqrst

Изменить три первых элемента

Содержимое: XYZDabcdefghij klmnopqrst

Класс LinkedList<T>

В классе LinkedList<T> создается коллекция в виде обобщенного двунаправленного списка. В этом классе реализуются интерфейсы ICollection, ICollection<T>, IEnumerable, IEnumerable<T>, ISerializable иIDeserializationCallback. В двух последних интерфейсах поддерживается сериализация списка. В классе LinkedList<T> определяются два приведенных ниже открытых конструктора.

public LinkedListO

public LinkedList(IEnumerable<T> collection)

В первом конструкторе создается пустой связный список, а во втором конструкторе — список, инициализируемый элементами из коллекции collection.

Как и в большинстве других реализаций связных списков, в классе LinkedList<T> инкапсулируются значения, хранящиеся в узлах списка, где находятся также ссылки на предыдущие и последующие элементы списка. Эти узлы представляют собой объекты класса LinkedListNode<T>. В классе LinkedListNode<T> предоставляются четыре следующих свойства.

public LinkedListNode<T> Next { get; } public LinkedListNode<T> Previous { get; } public LinkedList<T> List { get; } public T Value { get; set; }

С помощью свойств Next и Previous получаются ссылки на предыдущий и последующий узлы списка соответственно, что дает возможность обходить список в обоих направлениях. Если же предыдущий или последующий узел отсутствует, то возвращается пустая ссылка. Для получения ссылки на сам список служит свойство List. А с помощью свойства Value можно устанавливать и получать значение, находящееся в узле списка.

В классе LinkedList<T> определяется немало методов. В табл. 25.16 приведены наиболее часто используемые методы данного класса. Кроме того, в классе LinkedList<T> определяются собственные свойства, помимо тех, что уже объявлены в интерфейсах, которые в нем реализуются. Эти свойства приведены ниже.

public LinkedListNode<T> First { get; } public LinkedListNode<T> Last { get; }

С помощью свойства First получается первый узел в списке, а с помощью свойства Last — последний узел в списке.

Таблица 25.16. Наиболее часто используемые методы, определенные в классе LinkedList<T>

Метод

Описание

public LinkedListNode<T>

Добавляет в список узел со значением value не

AddAfter(LinkedListNode<T>

посредственно после указанного узла node. Указы

node, T value)

ваемый узел node не должен быть пустым (null). Метод возвращает ссылку на узел, содержащий значение value

public void

Добавляет в список новый узел newNode непо

AddAfter(LinkedListNode<T>

средственно после указанного узла node. Ука

node, LinkedListNode<T>

зываемый узел node не должен быть пустым

newNode)

(null). Если узел node отсутствует в списке или если новый узел newNode является частью другого списка, то* генерируется исключение

InvalidOperationException

public LinkedListNode<T>

Добавляет в список узел со значением value непо

AddBefore(LinkedListNode<T>

средственно перед указанным узлом node. Указы

node, T value)

ваемый узел node не должен быть пустым (null). Метод возвращает ссылку на узел, содержащий значение value

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*