Foreversoft.ru

IT Справочник
2 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Списки си шарп

List C# | Работа со списками в C#

Опубликовано Константин Туйков в 04.12.2019 04.12.2019

List C# — списки — представляют собой удивительно гибкий инструмент по работе с коллекциями. Одной из главных особенностей списков является возможность использовать любой тип данных. Кроме того, в списках реализовано множество полезных методов.

Список может быть объявлен следующим образом:

По сути, использоваться может абсолютно любой тип данных. Данный механизм называется обобщения C#.

» data-medium-file=»https://shwanoff.ru/wp-content/uploads/2019/11/List-300×175.gif» data-large-file=»https://shwanoff.ru/wp-content/uploads/2019/11/List.gif» src=’https://cdn.shortpixel.ai/client/q_lqip,ret_wait/https://shwanoff.ru/wp-content/uploads/2019/11/List.gif’ data-src=»https://cdn.shortpixel.ai/client/q_glossy,ret_img/https://shwanoff.ru/wp-content/uploads/2019/11/List.gif» alt=»list C#» /> list C#

Итак, для начала рассмотрим простые операции по добавлению, удалению и редактированию элементов списка.

Итак, в данном примере рассмотрены основные методы по работе со списками. Add – позволяет добавить новый элемент в конец списка. При помощи метода Remove можно удалить выбранный элемент из списка. А метод RemoveAt удаляет элемент, расположенный по соответствующему индексу. Для очистки списка может быть использован метод Clear.

Бонусы из коробки

Кроме того, мы можем использовать разнообразные коробочные методы и свойства списков, которые доступны нам изначально. Так, мы можем получить количество элементов в списке, обратившись к свойству Count. Метод Contains позволяет определить, есть ли элемент в списке. Одним из самых приятных бонусов является метод сортировки Sort, при помощи которого можно отсортировать элементы списка по какому-либо условию. Рассмотрим код, реализующий примеры использования данных методов.

List C# — пара слов о потокобезопасности

Списки в C# позволяют выполнять множество операций чтения в разных потоках, что не слишком безопасно. Но проблемы обычно возникают при изменении коллекции более чем в одном потоке. Именно поэтому рекомендуется блокировать список на время выполнения операций записи и чтения. Увы, коробочного механизма синхронизации нет, а потому при необходимости нужно будет реализовать свой.

Самым простым вариантом, является блокировка ресурса через lock.

List C# – итого

Списки C# представляют собой крайне удобный инструмент по работе с коллекциями элементов. C# предоставляет обширный набор реализованных методов, при помощи которых можно обработать фактически любую коллекцию элементов. Кроме того, как и любой класс, списки могут быть расширены дополнительными методами и механизмами.

Кроме того, рекомендую прочитать статью Связный список C# — Linked List C#. А также подписывайтесь на группу ВКонтакте, Telegram и YouTube-канал. Там еще больше полезного и интересного для программистов.

Перечисления и коллекции в C#

Платформа .NET содержит набор типов для хранения и управления коллекциями объектов: списки с изменяемыми размерами, связанные списки, отсортированные и неотсортированные словари, массивы.

Типы в .NET для коллекций можно разделить на три категории:

  • интерфейсы, определяющие стандартные протоколы коллекций
  • готовые к использованию классы коллекций (списки, словари)
  • базовые классы для написания коллекций

Все эти типы расположены в следующих пространствах имен:

  • System.Collections — необобщенные классы и интерфейсы коллкций
  • System.Collections.Specialized — строго типизированные необобщенные классы коллекций
  • System.Collections.Generic — обобщенные классы и интерфейсы коллекций
  • System.Collections.ObjectModel — прокси и базовые классы для специальных коллекций
  • System.Collections.Concurrent — коллекции, безопасные к потокам
Читать еще:  Задачи паскаль 9 класс с решением

Все коллекции являются перечислениями и реализуют (должны реализовывать) интерфейс IEnumerable или IEnumerable .

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

Иерархия интерфейсов коллекций:

  • IEnumerable и IEnumerable — минимальный уровень функциональности: только перечисление
  • ICollection и ICollection — средний уровень функциональности, например, свойство Count
  • IList , IDictionary и их необобщенные аналоги — максимальный уровень функциональности

Перечисление (Enumeration)

Нумератор, или перечислитель (enumerator) — доступный только для чтения однонаправленный курсор (forward-only cursor — курсор, движущийся только вперёд, без возможности обратного перемещения) перебирающий последовательность (sequence) значений. Нумератор представляет собой объект, реализующий интерфейс System.Collections.IEnumerator или System.Collections.Generic.IEnumerator .

Инструкция foreach перебирает, или выполняет итерацию (iterate) над перечислимыми (enumerable) объектами. Перечислимые объекты — это логическое представление последовательностей. Перечислимый объект — это не курсор, о котором говорилось выше, а объект, содержащий такой курсор, способный перемещаться по объекту и перебирать его. Перечислимый объект либо реализует интерфейс IEnumerable или IEnumer able , либо содержит метод GetEnumerator , который возвращает нумератор (enumerator).

Интерфейсы IEnumerable и IEnumerator

Интерфейс IEnumerator определяет базовый низкоуровневый протокол, посредством которого производится проход по элементам (перечисление) последовательности в одонаправленной манере. Объявление этого интерфейса:

Связный список: класс LinkedList

C# — Руководство по C# — Связный список: класс LinkedList

Класс LinkedList представляет собой двухсвязный список, в котором каждый элемент ссылается на следующий и предыдущий, как показано на рисунке:

Преимущество связного списка проявляется в том, что операция вставки элемента в середину выполняется очень быстро. При этом только ссылки Next (следующий) предыдущего элемента и Previous (предыдущий) следующего элемента должны быть изменены так, чтобы указывать на вставляемый элемент. В классе List при вставке нового элемента все последующие должны быть сдвинуты.

Естественно, у связных списков есть и свои недостатки. Так, например, все элементы связных списков доступны лишь друг за другом. Поэтому для нахождения элемента, находящегося в середине или конце списка, требуется довольно много времени. Связный список не может просто хранить элементы внутри себя. Вместе с каждым из них ему необходимо иметь информацию о следующем и предыдущем элементах. Вот почему LinkedList содержит элементы типа LinkedListNode . С помощью класса LinkedListNode появляется возможность обратиться к предыдущему и последующему элементам списка. Класс LinkedListNode определяет свойства List, Next, Previous и Value. Свойство List возвращает объект LinkedList , ассоциированный с узлом. Свойства Next и Previous предназначены для итераций по списку и для доступа к следующему и предыдущему элементам. Свойство Value типа T возвращает элемент, ассоциированный с узлом.

Сам класс LinkedList определяет члены для доступа к первому (First) и последнему (Last) элементам в списке, для вставки элементов в определенные позиции (AddAfter(), AddBefore(), AddFirst(), AddLast()), для удаления элементов из заданных позиций (Remove(), RemoveFirst(), RemoveLast()) и для нахождения элементов, начиная поиск либо с начала (Find()), либо с конца (FindLast()) списка.

Читать еще:  Что такое си шарп

В классе LinkedList реализуются интерфейсы ICollection, ICollection , IEnumerable, IEnumerable , ISerializable и IDeserializationCallback. В двух последних интерфейсах поддерживается сериализация списка. В классе LinkedList определяются два приведенных ниже открытых конструктора:

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

В классе LinkedList определяется немало методов. Наиболее часто используемые методы, определенные в классе LinkedList представлены ниже:

AddAfter()

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

AddBefore()

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

AddFirst(), AddLast()

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

Find()

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

Remove()

Удаляет из списка первый узел, содержащий передаваемое значение. Возвращает логическое значение true, если узел удален, т.е. если узел со значением обнаружен в списке и удален; в противном случае возвращает логическое значение false.

Давайте рассмотрим пример использования связных списков:

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

Списки си шарп

Дата изменения: 09.10.2017

Класс List представляет собой динамический массив объектов. Определен в пространстве имен System.Collections.Generic и является универсальной коллекцией, то есть позволяет хранить только однородные объекты.

Автоматически изменяет емкость: при добавлении элемента – увеличивает, при удалении -уменьшает на единицу. За каждым элементов коллекции закреплен индекс, который присваивается согласно порядку добавления в коллекцию. Индекс отчитывается от 0.

Максимальная емкость объекта List 2 миллиарда ссылок на объекты в 64 разрядной адресации.

По функциональности – эквивалент класса ArrayList (System.Collections). Однако его использование более эффективно в отношении потраченного процессорного времени, за счет того, что он хранит объекты одного типа.

List допускает дубликаты в коллекции.

Реализует интерфейсы: IList , ICollection , IEnumerable , IEnumerable, IList, ICollection, IReadOnlyList , IReadOnlyCollection .

Создание объекта

Использование конструкторов коллекций ArrayList и List практически идентично, разница лишь в том, что для последнего в угловых скобках приходится указывать тип, экземпляры которого будут в нем храниться.

Примеры:

  1. List ListArray1 = new List ();
  2. List ListArray2 = new List (intArray1); // инициализируем новый объект, обычным массивом с элементами типа int. Перед этим массив должен быть создан и заполнен.
  3. List ListArray3 = new List (100); // Создаем экземпляр объекта коллекции с емкостью в 100 элементов. Массив будет хранить ссылки на экземпляры пользовательских объектов типа Bird.
Читать еще:  Язык си логические операции

Члены класса и их использование

Для добавления элемента в коллекцию используются методы Add и AddRange. Делают они одно и то же. Разница в том, что Add – реализация интерфеса IList , а AddRange – ICollections .

Класс имеет несколько полезных свойств: Capacity, Count, Item.

При помощи свойства Capacity можно задать емкость массива. Count возвращает количество его элементов (включая дубликаты, если они есть), Item вернет элемент по указанному индексу.

Методы поиска, удаления и сортировки элементов работают над основой объекта, называемого компаратором. Его использование обосновано, тем что сравниваются экземпляры конкретных типов (значений или ссылочных). Компаратор – это алгоритм, метод сравнения определенный или переопределенный в самой иерархии объектов, к которой принадлежит действующий, либо это метод реализации одного из интерфейсов: IEqutable или IComparable .

Экземпляр класса List может использовать два вида компараторов:

  1. Компаратор проверки на равенство;
  2. Компаратор упорядочивания.

Компаратор проверки на равенство используется в методах Contains, IndexOf, LastIndexOf, и Remove. Contains – проверяет наличие в коллекции элемента, переданного ему в качестве параметра. IndexOf и LastIndexOf найдут указанный в параметре элемент и вернут его индекс, IndexOf – первого вхождения, LastIndexOf – последнего. Метод Remove – удаляет первый найденный найденный элемент.

Компаратор проверки на равенство – это метод Equals(T), часть реализации интерфейса IEqutable . Если хранящийся в коллекции тип не реализует этот интерфейс, то компаратор сравнения для этого типа внутри экземпляра List — это унаследованный от типа Object метод Equals.

Компаратор упорядочивания используется методом Sort, для сортировки элементов массива. Также необходим для работы методов поиска вроде BinarySearch, требующих предварительной сортировки массива List .

Если объекты типа, хранящиеся в массиве, реализуют интерфейс IComarible , то компаратором упорядочивания станет метод ComareTo(T), чать определения этого интерфейса.

Если объекты типа в массиве реализуют необобщенную версию интерфейса IComarible, то компаратор – метод CompareTo(Object).

Если не один из интерфейсов типом не реализуется, компаратор должен быть указан явно в виде делегата со ссылкой на метод сравнения (анонимный делегат или лямбда-выражение тоже подойдет).

Следующий пример демонстрирует этапы создания, удаления и вставки объектов пользовательского класса в объект коллекции List :

В примере видно, что большинство методов массивов ArrayList и List совпадают. Это не удивительно, ведь они реализуют одни и те же интерфейсы.

Класс List допускает параллельное считывание элементов разными потоками. Все его статические члены потокобезопасны, но не безопасность объектов, хранящихся в нем не гарантируется.

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

Ссылка на основную публикацию
Adblock
detector