Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Универсальные коллекции языка С#. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
Испания46934632 Люксембург613894 Франция67028048
В следующем примере демонстрируется несколько свойств и мето­дов List<T> при работе с объектами стандартного типа String.
Конструктор без параметров используется для создания списка строк с емкостью по умолчанию. Отображается значение свойства Ca­pacity, а затем метод Add используется для добавления нескольких элементов. Элементы перечисляются, и свойство Capacity отображает­ся вместе со свойством Count, чтобы показать, что
емкость увеличи-
лась по мере необходимости.
Метод Contains используется для проверки наличия элемента в списке, метод Insert используется для вставки нового элемента в се­редину списка, и содержимое списка снова выводится.
Свойство по умолчанию Item[] (индексатор в C#) используется для получения элемента, метод Remove используется для удаления первого экземпляра повторяющегося элемента, добавленного ранее, а содер­жимое
снова отображается. Метод Remove всегда удаляет первый об-
наруженный экземпляр.
Метод TrimExcess используется для уменьшения емкости Capacity в соответствии с количеством Count, и отображаются свойства Capacity и Count. Если неиспользуемая емкость была меньше 10 % от общей емкости, размер списка не изменится.
Наконец, метод Clear используется для удаления всех элементов из списка, и отображаются свойства Capacity и Count.
usingSystem; usingSystem.Collections.Generic;
namespaceПример_2 {
classProgram { staticvoidMain(string[]args) { List<string>countries=newList<string> { "Австрия","Бельгия","Болгария",
41
"Венгрия","Германия","Греция","Дания" }; Console.WriteLine("\nCapacity:{0}",countries.Capacity); countries.Add("Польша"); countries.Add("Чехия"); Console.WriteLine(); foreach(stringcincountries) { Console.WriteLine(c); } Console.WriteLine("\nCapacity:{0}",countries.Capacity); Console.WriteLine("Count:{0}",countries.Count); Console.WriteLine("\nContains(\"Бельгия\"):{0}", countries.Contains("Бельгия")); Console.WriteLine("\nInsert(2,\"Великобритания\")"); countries.Insert(2,"Великобритания"); Console.WriteLine(); foreach(string { Console.WriteLine(с); } //Показываетобращениексписку,используяItemсвойство. Console.WriteLine("\ncountries[3]:{0}",countries[3]); Console.WriteLine("\nRemove(\"Германия\")"); countries.Remove(""); Console.WriteLine(); foreach(stringcincountries) { Console.WriteLine(c); } countries.TrimExcess(); Console.WriteLine("\nTrimExcess()"); Console.WriteLine("Capacity:{0}",countries.Capacity); Console.WriteLine("Count:{0}",countries.Count); countries.Clear(); Console.WriteLine("\nClear()"); Console.WriteLine("Capacity:{0}",countries.Capacity); Console.WriteLine("Count:{0}", } } }
сincountries)
countries.Count);
42
Результатработыпрограммы:Capacity:8
Австрия Бельгия Болгария Венгрия Германия Греция Дания Польша Чехия 
Capacity:16 Count:9
 Contains("Бельгия"):True  Insert(2,"Великобритания")  Австрия Бельгия Великобритания Болгария Венгрия Германия Греция Дания Польша Чехия  countries[3]:Болгария  Remove("Германия")  Австрия Бельгия Великобритания Болгария Венгрия Германия
43
Греция Дания Польша Чехия
TrimExcess() Capacity:10 Count:10
Clear() Capacity:10 Count:0
В следующем примере демонстрируется несколько свойств и мето­дов List<T> при работе с объектами типа int, использующих лямбда­выражения (см. Лямбда-выражения) для настройки реализуемых ими функций.
Вывод содержимого списка осуществляется параметризованным методом Print<T>, который принимает коллекции, реализующие ин­терфейс IEnumerable<T> (см. раздел Интерфейсы) и переопределяю­щие метод ToString().
Создается список, инициализируется начальным набором значений и выводится его содержимое. К списку методом AddRange добавляется набор значений, полученный список сортируется, и выводится его со­держимое. Методом BinarySearch отыскивается заданное значение и выводится его индекс. С помощью метода FindAll и лямбда­выражения создается новый список, в который копируются четные элементы исходного списка, и выводится его содержимое. С помощью метода FindAll и лямбда
-выражения создается новый список, в кото­рый копируются элементы исходного списка, принадлежащие задан­ному диапазону, и выводится его содержимое. С помощью метода ForEach и лямбда-выражения выводятся квадраты значений исходного списка. С помощью метода Aggregate и лямбда-выражения отыскива­ется и выводится сумма четных значений исходного списка. С по­мощью метода Any получаем
ответы на вопросы: имеется ли в списке хотя бы один элемент больше заданного значения и меньше заданного значения? С помощью метода TakeWhile и лямбда-выражения создаем список, в который включаются копии элементов исходного списка,
44
от первого до последнего элемента, удовлетворяющего условию, заданному лямбда-выражением, и выводим его содержимое.
usingSystem; usingSystem.Collections.Generic; usingSystem.Linq;
namespaceПример_3 {
classProgram { staticvoidPrint<T>(inIEnumerable<T>col,stringheader) { Console.WriteLine(header); foreach(varelmincol) Console.Write(elm+""); Console.WriteLine(); Console.WriteLine(); } staticvoidMain(string[]args) { List<int>numbers=newList<int>{  List<int>list=newList<int>(numbers); Print(list,"Списокпослесоздания:");  list.AddRange(newint[]{15,20,9}); Print(list,"СписокпоследобавленияAddRange(newint[]{15,20,9}):");  list.Sort(); Print(list,"Списокпослесотировки:"); Console.WriteLine($"Элемент4вспискеподиндексом={list.BinarySearch(4)}");  varl=list.FindAll(x=>x%2==0); Print(l,"Списоквсехчетныхэлементовlist:  inta=7,b=20; vart=list.FindAll(x=>{return(x>a)&(x<b);}); Print(t,"Списокэлементовlistвдиапазоне(7..20):");  Console.WriteLine("Выводитквадратыэлементовспискаlist:"); list.ForEach(x=>{Console.WriteLine(x*2);});
4,1,7,3,5};
");
45
intnumEven=list.Aggregate(0,(total,next)=> next%2==0?total+1:total);  Console.WriteLine($"Количествочетныхэлементовспискаlist:{numEven}");  boolres=list.Any(elm=>elm>15); Console.WriteLine($"Естьэлементболше15‐{res}"); res=list.Any(elm=>elm<0); Console.WriteLine($"Естьэлементменьше0‐{res}");  List<int>result=newList<int>(); IEnumerable<int>listPart= list.TakeWhile(p=>p<7);  foreach(intnuminlistPart) { result.Add(num); Console.WriteLine(num); } Print(result,"Элементыlistотначаладоэлемента=или<7:"); } } }  Результатработыпрограммы: Списокпослесоздания: 41735  СписокпоследобавленияAddRange(newint[]{15,20,9}): 417351520  Списокпослесотировки: 1345791520  Элемент4вспискеподиндексом=2 Списоквсехчетныхэлементовlist: 420  Списокэлементовlistвдиапазоне(7..20): 915  Выводитквадратыэлементовспискаlist:
2 6
9
46
8 10 14 18 30 40
Количествочетныхэлементовспискаlist:2 Естьэлементболше15‐True Естьэлементменьше0‐False
1 3 4 5 Элементыlistотначаладоэлемента=или>7: 1345
КОЛЛЕКЦИЯ SORTEDLIST<TKEY,TVALUE> –
СОРТИРОВАННЫЙ СПИСОК
Сортированный список SortedList<TKey,TValue> реализуется как массив пар «ключ-значение», отсортированных по ключу. Здесь TKey – тип ключа, TValue – тип значения. Каждый элемент может быть извлечен как объект KeyValuePair<TKey,TValue>.
Ключевые объекты должны быть неизменными, если они исполь­зуются в качестве ключей в SortedList<TKey,TValue>. Каждый ключ должен быть уникальным. Ключ не может быть null, но значение мо­жет быть,
если тип значений TValue в списке является ссылочным
типом.
Коллекции SortedList<TKey,TValue> требуется реализация компа­ратора для сортировки и выполнения сравнений ключей. Компаратор по умолчанию Comparer<T>.Default проверяет, реализует ли тип TKey ключа интерфейс System.IComparable<T>, и использует его, если он доступен. Если нет, Comparer<T>.Default проверяет, реализует ли тип TKey ключа System.IComparable. Если тип TKey ключа не реализует ни один из интерфейсов,
можно указать System.Collections.Generic.ICom­parer<T> реализацию в перегрузке конструктора, которую принимает параметр comparer.
Емкость – это количество элементов, которые SortedList
< TKey,TValue> может содержать. Когда элементы добавляются в кол-
47
лекцию SortedList<TKey,TValue>, емкость автоматически увеличива­ется по мере необходимости путем перераспределения внутреннего массива. Емкость можно уменьшить, вызвав метод TrimExcess или яв­но задав свойство Capacity. Уменьшение емкости приводит к повтор­ному распределению памяти и копированию всех элементов в Sorted-
List<TKey,TValue>.
Универсальный класс SortedList<TKey,TValue> представляет собой массив пар «ключ-значение» с временной сложностью извлечения (log n), где n – число элементов
в словаре. В этом случае он аналогичен уни­версальному классу SortedDictionatyt<TKey,TValue>. Эти два класса имеют аналогичные объектные модели, и оба имеют доступ c времен­ной сложностью (log n). Два класса различаются в использовании па­мяти и скорости вставки и удаления:
сортированный список SortedList<TKey,TValue> использует
меньше памяти, чем сортированный словарь SortedDictionary<TKey,
TValue>;
сортированный словарь SortedDictionary<TKey,TValue> имеет
более быстрые операции вставки и удаления для несортированных данных, чем список SortedList<TKey,TValue>;
если коллекция заполняется только один раз отсортированными
данными, то сортированный список SortedList<TKey,TValue> заполня­ется быстрее, чем сортированный словарь SortedDictionary<TKey,
TValue>.
Другое различие между классами SortedList<TKey,TValue> и Sort­edDictionary<TKey,TValue> состоит в том, что SortedList<TKey, TValue> поддерживает эффективное индексированное извлечение
ключей и значений через коллекции, возвращаемые свойствами Keys и Values. Нет необходимости повторно создавать списки при доступе к свойствам, так как списки являются просто оболочками для внутрен­них массивов ключей и значений.
В классе сортированный список SortedList<TKey, TValue> реали­зуются
интерфейсы IDictionary, IDictionary<TKey, TValue>, ICollection, ICollection<KeyValuePair<TKey, TValue>>, IEnumerable и IEnumera­ble<KeyValuePair<TKey, TValue> (см. Интерфейсы).
В сортированном списке реализованы свойства, представленные
в следующей таблице.
48
Свойства Назначение
t
р
t
t
y
t
Capacity
Comparer
Count
Item[TKey]
Keys
Values
Возвращает или задает число элементов, которое может содержать сортированный список SortedLis
Возвращает интерфейс IComparable<T> для сортированного списка
Возвращает число пар «ключ-значение», содержащихся в со тированном списке SortedLis
Возвращает или задает значение, связанное с указанным ключом
Возвращает коллекцию, содержащую ключи в SortedLis
,TValue>, в отсортированном порядке
TKe
Возвращает коллекцию, содержащую значения из сортиро­ванного списка SortedLis
<TKey,TValue>
<TKey,TValue>
<TKey,TValue>
<
В классе SortedList<TKey, TValue> имеется несколько конструкто-
ров. Ниже перечислены наиболее часто используемые:
publicSortedList() publicSortedList(IDictionary<TKey,TValue>dictionary) publicSortedList(intcapacity) publicSortedList(IComparer<TK>comparer)
В первой форме конструктора создается пустой список с выбирае­мой по умолчанию первоначальной емкостью. Во второй форме кон­структора сортированный список инициализируется элементами, ско­пированными из коллекции dictionary, реализующей интерфейс IDictionary<TKey, TValue> и использующей интерфейс IComparer<T> по умолчанию. В третьей форме конструктора с помощью параметра capacity задается емкость коллекции, создаваемой в виде сортирован­ного
списка. Если размер списка заранее известен, то, указав емкость создаваемой коллекции, можно исключить изменение размера списка во время выполнения, что, как правило, требует дополнительных за­трат вычислительных ресурсов. В четвертой форме конструктора необходимо указать с помощью параметра comparer способ сравнения объектов, содержащихся в списке.
В сортированном списке определяется ряд собственных методов
помимо
тех, что уже объявлены в интерфейсах, которые в нем реали­зуются. Некоторые из наиболее часто используемых методов этого класса перечислены ниже.
-
49
Метод Описание
–
–
Add() Добавляет в список пару «ключ-значение». Если ключ
уже находится в списке, то его значение не изменяется и генерируется исключение ArgumentException
ContainsKey() Возвращает логическое значение true, если вызывающий
список содержит объект key в качестве ключа; а иначе – логическое значение false
ContainsValue() Возвращает логическое значение true, если вызывающий
список содержит значение value; в противном случае – логическое значение false
GetEnumerator() Возвращает перечислитель для вызывающего списка IndexOfKey(), IndexOfValue()
Remove() Удаляет из списка пару «ключ-значение» по указанному
TrimExcess() Сокращает избыточную емкость вызывающей коллекции
Возвращает индекс ключа или первого вхождения значе­ния в вызывающем списке. Если искомый ключ или зна­чение не обнаружены в списке, возвращается значение
ключу key. При удачном исходе операции возвращается логическое значение true, а если ключ key отсутствует в списке
логическое значение false
1
В сортированном списке SortedList<TKey, TValue> реализован ин-
дексатор, определенный в интерфейсе IDictionary<TKey, TValue>
publicTValuethis[TKeykey]{get;set;}
Этот индексатор служит для получения и установки значения эле­мента коллекции, а также для добавления в коллекцию нового элемен­та, но в данном случае в качестве индекса служит ключ элемента, а не сам индекс.
В следующем примере кода создается коллекция SortedList<string, int> со строковым ключом, начальные значения элементов задаются с помощью списка
инициализации, метод Add используется для добав­ления элементов. Элементы коллекции выводятся на консоль с по­мощью метода Print<TKey,TValue>. В примере показано, что метод Add при попытке добавления повторяющегося ключа создает исклю­чение ArgumentException.
Свойство Item[] используется для извлечения значений, демон­стрируется возникновение исключения KeyNotFoundException, когда запрошенный ключ отсутствует, показано, что значение, связанное с ключом, можно заменить,
используя индексатор.
50
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]