Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Универсальные коллекции языка С#. Учебное пособие
.pdf
Испания46934632
Люксембург613894
Франция67028048
В следующем примере демонстрируется несколько свойств и методов List<T> при работе с объектами стандартного типа String.
Конструктор без параметров используется для создания списка
строк с емкостью по умолчанию. Отображается значение свойства Capacity, а затем метод Add используется для добавления нескольких
элементов. Элементы перечисляются, и свойство Capacity отображается вместе со свойством Count, чтобы показать, что
емкость увеличи-
лась по мере необходимости.
Метод Contains используется для проверки наличия элемента
в списке, метод Insert используется для вставки нового элемента в середину списка, и содержимое списка снова выводится.
Свойство по умолчанию Item[] (индексатор в C#) используется для
получения элемента, метод Remove используется для удаления первого
экземпляра повторяющегося элемента, добавленного ранее, а содержимое
снова отображается. Метод Remove всегда удаляет первый об-
наруженный экземпляр.
Метод TrimExcess используется для уменьшения емкости Capacity
в соответствии с количеством Count, и отображаются свойства Capacity
и Count. Если неиспользуемая емкость была меньше 10 % от общей
емкости, размер списка не изменится.
Наконец, метод Clear используется для удаления всех элементов из
списка, и отображаются свойства Capacity и Count.
usingSystem;
usingSystem.Collections.Generic;
namespaceПример_2
{
classProgram
{
staticvoidMain(string[]args)
{
List<string>countries=newList<string>
{
"Австрия","Бельгия","Болгария",
41

"Венгрия","Германия","Греция","Дания"
};
Console.WriteLine("\nCapacity:{0}",countries.Capacity);
countries.Add("Польша");
countries.Add("Чехия");
Console.WriteLine();
foreach(stringcincountries)
{
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(stringcincountries)
{
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
{
classProgram
{
staticvoidPrint<T>(inIEnumerable<T>col,stringheader)
{
Console.WriteLine(header);
foreach(varelmincol)
Console.Write(elm+"");
Console.WriteLine();
Console.WriteLine();
}
staticvoidMain(string[]args)
{
List<int>numbers=newList<int>{
List<int>list=newList<int>(numbers);
Print(list,"Списокпослесоздания:");
list.AddRange(newint[]{15,20,9});
Print(list,"СписокпоследобавленияAddRange(newint[]{15,20,9}):");
list.Sort();
Print(list,"Списокпослесотировки:");
Console.WriteLine($"Элемент4вспискеподиндексом={list.BinarySearch(4)}");
varl=list.FindAll(x=>x%2==0);
Print(l,"Списоквсехчетныхэлементовlist:
inta=7,b=20;
vart=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

intnumEven=list.Aggregate(0,(total,next)=>
next%2==0?total+1:total);
Console.WriteLine($"Количествочетныхэлементовспискаlist:{numEven}");
boolres=list.Any(elm=>elm>15);
Console.WriteLine($"Естьэлементболше15‐{res}");
res=list.Any(elm=>elm<0);
Console.WriteLine($"Естьэлементменьше0‐{res}");
List<int>result=newList<int>();
IEnumerable<int>listPart=
list.TakeWhile(p=>p<7);
foreach(intnuminlistPart)
{
result.Add(num);
Console.WriteLine(num);
}
Print(result,"Элементыlistотначаладоэлемента=или<7:");
}
}
}
Результатработыпрограммы:
Списокпослесоздания:
41735
СписокпоследобавленияAddRange(newint[]{15,20,9}):
417351520
Списокпослесотировки:
1345791520
Элемент4вспискеподиндексом=2
Списоквсехчетныхэлементовlist:
420
Списокэлементовlistвдиапазоне(7..20):
915
Выводитквадратыэлементовсписка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.IComparer<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> и SortedDictionary<TKey,TValue> состоит в том, что SortedList<TKey,
TValue> поддерживает эффективное индексированное извлечение
ключей и значений через коллекции, возвращаемые свойствами Keys
и Values. Нет необходимости повторно создавать списки при доступе
к свойствам, так как списки являются просто оболочками для внутренних массивов ключей и значений.
В классе сортированный список SortedList<TKey, TValue> реализуются
интерфейсы IDictionary, IDictionary<TKey, TValue>, ICollection,
ICollection<KeyValuePair<TKey, TValue>>, IEnumerable и IEnumerable<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)
publicSortedList(intcapacity)
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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
