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

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

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
staticvoidMain(string[]args) { //Городамиллионники.Населениевтысячахчеловек. //Создаетновыйсловарьцелыхчисел,состроковымиключами. SortedDictionary<string,int>cyties=newSortedDictionary<string,int>() { {"Челябинск",1196}, {"Омск",1154}, {"Самара",1156}, {"Ростов‐на‐Дону",1137}, {"Уфа",1128}, }; Print(cyties,"Городамиллионники:"); //Добавляемнесколькоэлементовксловарю.Внихнедолжнобыть //дубликатовключейсловаря, //нонекоторыезначениямогутдублироваться cyties.Add("Красноярск",1093); cyties.Add("Пермь",1055); //МетодAddmethodвыбрасываетисключение, //еслиновыйключужеестьвсловаре. Print(cyties,"Городамиллионникипоследобавления:"); try { cyties.Add("Самара",1156); } catch(ArgumentException) { Console.WriteLine("Элементсключом=\"Самара\"Ужесуществует."); } //СвойствоItemявляетсядругимименемдляиндексатора,такчто //можноопускатьегоимяприобращениикэлементам. Console.WriteLine("Дляключа=\"Омск\",value={0}.", cyties["Омск"]); // Индекс можно использовать,чтобыизменитьзначениесвязанногосним ключа. cyties["Пермь"]=1057; Console.WriteLine("Дляключа=\"Пермь\",value={0}.", cyties["Пермь"]); //Еслиключнесуществует,присваиваниеиндексаторудляэтогоключа //добавляетновуюпаруключ/значение(key/value). cyties["Воронеж"]=1058;
.
81
//Индексаторвыбрасываетисключение,еслизапрашиваемогоключа //нетвсловаре. try { Console.WriteLine("Forkey=\"tif\",value={0}.", cyties["Краснодар"]); } catch(KeyNotFoundException) { Console.WriteLine("Ключ=\"Краснодар\"несуществует."); } //Когдапрограммачастодолжназапрашиватьключи,которыхможет //неоказатьсявсловаре, //TryGetValueможетстатьболееэффективнымпутемизвлекатьзначения. intvalue; if(cyties.TryGetValue("",outvalue)) { Console.WriteLine("Дляключа= } else { Console.WriteLine("Ключ=\"Челябинск\"Ненайден."); } //ContainsKeyможноиспользоватьдляпроверкиключейпередихвставкой. if(!cyties.ContainsKey("Волгоград")) { cyties.Add("Волгоград",1008); Console.WriteLine("Значениедобавленодляключа=\"Волгоград\":{0}", cyties["Волгоград"]); } //Когдавыиспользуетеforeachперебораэлементовсловаря, //элементыизвлекаютсякакKeyValuePairобъекты. Console.WriteLine(); foreach(KeyValuePair<string,int> { Console.WriteLine("Key={0},Value={1}", kvp.Key,kvp.Value); } //Чтобыполучитьтолькозначения,используйтесвойствоValues. SortedDictionary<string,int>.ValueCollectionvalueColl= cyties.Values;
\"Челябинск\",value={0}.",value);
kvpincyties)
82
//ЭлементыValueCollectionявляютсястроготипизированными //стипомкоторыйбылописандлязначений(value)библиотеки. Console.WriteLine(); foreach(intsinvalueColl) { Console.WriteLine("Value={0}",s); } //Чтобыполучитьтолькоключи,используйтесвойствоKeys. SortedDictionary<string,int>.KeyCollectionkeyColl= cyties.Keys; //ЭлементыValueCollectionявляютсястроготипизированными //стипомкоторыйбылописандлязначений(key)библиотеки. Console.WriteLine(); foreach(stringsinkeyColl) { Console.WriteLine("Key={0}",s); } //UsetheRemovemethodtoremoveakey/valuepair. Console.WriteLine("\nRemove(\"Челябинск\")"); cyties.Remove("Челябинск"); if(!cyties.ContainsKey("Челябинск")) { Console.WriteLine("Ключ\"Челябинск\"ненайден."); } } } }  Результатработыпримера: Городамиллионники:
[Омск,1154] [Ростов‐на‐Дону,1137] [Самара,1156] [Уфа,1128] [Челябинск,1196]
 Городамиллионникипоследобавления:
Красноярск,1093]
[ [Омск,1154] [Пермь,1055] [Ростов‐на‐Дону,1137] [Самара,1156]
83
[Уфа,1128] [Челябинск,1196]
 Элементсключом="Самара"ужесуществует. Дляключа="Омск",value=1154. Дляключа="Пермь",value=1057. Ключ="Краснодар"несуществует. Ключ="Челябинск"ненайден. Значениедобавленодляключа="Волгоград":1008 
Key=Волгоград,Value=1008 Key=Воронеж,Value=1058
=Красноярск,Value=1093
Key Key=Омск,Value=1154 Key=Пермь,Value=1057 Key=Ростов‐на‐Дону,Value=1137 Key=Самара,Value=1156 Key=Уфа,Value=1128 Key=Челябинск,Value=1196
Value=1008 Value=1058 Value=1093 Value=1154 Value=1057 Value=1137 Value=1156 Value=1128 Value=1196
Key=Волгоград Key=Воронеж Key=Красноярск Key=Омск Key=Пермь Key=Ростов‐на‐Дону Key=Самара Key=Уфа Key=Челябинск
 Remove("Челябинск") Ключ"Челябинск"ненайден.
84
КЛАСС SORTEDDICTIONARY<TKEY, TVALUE> –
СОРТИРОВАННЫЙ СЛОВАРЬ
Объекты класса Сортированный словарь реализуются в форме де­рева бинарного поиска, в котором все элементы отсортированы на ос­нове ключа. Тип ключа должен реализовывать интерфейс ICom­parable<TKey>. Если тип ключа не сортируемый, компаратор можно также создать, реализовав IComparer<TKey> и указав его в качестве аргумента конструктора сортированного словаря.
Классы SortedDictionary<TKey, Tvalue> и SortedList<TKey, TValue> имеют сходную функциональность. Но
поскольку SortedList<TKey,
TValue> реализован в виде списка, основанного на массиве, a Sorted­Dictionary<TKey, Tvalue> реализован как словарь, эти классы облада-
ют разными характеристиками.
Коллекция SortedList<TKey, TValue> использует меньше памяти, чем SortedDictionary<TKey, TValue>. Коллекция SortedDictionary <TKey, TValue> быстрее вставляет и удаляет элементы.
При наполнении коллекции SortedList<TKey,TValue> отсортиро­ванными данными она работает быстрее, если при этом не требуется изменение емкости.
В классе SortedDictionary<TKey, TValue> определены следующие конструкторы:
public SortedDictionary()
public SortedDictionary(IDictionary<TKey, TValue> dictionary)
public SortedDictionary(IComparer<TKey> comparer)
public SortedDictionary(IDictionary<TKey, TValue> dictionary, ICom­parer<TKey> comparer)
В первом конструкторе создается пустой словарь, во втором кон­структоре – словарь с указанным количеством элементов dictionary. В третьем конструкторе допускается указывать с помощью параметра comparer типа IComparer<TKey> способ сравнения, используемый для сортировки, а в четвертом конструкторе – инициализировать словарь, помимо указания способа сравнения.
В следующем примере показывается, как с помощью сортирован­ного
словаря обрабатывать объекты класса пользователя. Для примера использован пользовательский класс Country, объекты которого со­держат имя континента и имя страны. Значения, помещаемые в сло­варь, имеют тип int – это численность населения в тысячах человек.
85
Для того чтобы словарь мог выполнять операции над объектами, в классе объектов реализован интерфейс IComparable<Country> с ме­тодом CompareTo(Country country), определяющим правило сравнения объектов Country. В примере создается сортированный словарь Sort­edDictionary<Country, int> с ключом типа Country и значением типа int и инициализируется тремя элементами, затем используется метод Add для добавления элементов. Показано, что метод Add выбрасывает ис­ключение ArgumentException при попытке
добавления повторяющего-
ся ключа.
Свойство Item[] используется для извлечения значений, демон­стрируется, что исключение KeyNotFoundException возникает, когда запрошенный ключ отсутствует, и показано, что значение, связанное с ключом, можно заменить.
Демонстрируется использование метода TryGetValue как более эф­фективного способа получения значений, если программа часто пыта­ется запрашивать значения ключей, которых нет в словаре, а также
по­казано, как использовать метод ContainsKey для проверки наличия ключа перед вызовом метода Add.
Показано, как просмотреть ключи и значения в словаре, а также, как просмотреть только ключи и только значения с помощью свойства Keys и cвойства Values.
Демонстрируется использование метода Remove для удаления эле­мента по заданному ключу.
publicclassCountry:IComparable<Country> { publicstringContinent{get;} publicstringName{get;} publicCountry(stringcontinent,stringname) { Continent=continent; Name=name; } publicoverridestringToString() { return$"Континент:{Continent,10},\tстрана:{Name,10}"; } //Методдлясравненияобъектовкласса publicintCompareTo(Countrycountry) {
.
86
if(Continent==country.Continent&Name==country.Name) return0; if((Continent.CompareTo(country.Continent)<0)| (Continent==country.Continent&Name.CompareTo(country.Name)<0)) return‐1; return1; } }  classProgram { staticvoidMain(string[]args) { //Создаемновыйсортированныйсловарьцелыхзначений, //сключом,которыйявляетяобъектомтипаCountry. //Инициируемеготремязначениями.
SortedDictionary<Country,int>countries=
 newSortedDictionary<Country,int>(){ {newCountry("с.Америка","США"),330000}, {newCountry("с.Америка","Канада"),34346}, {newCountry("с.Америка","Мексика"),111212}, }; countries.Add(newCountry("Европа","Франция"),63920);//Ошибка. Верное=63929 Print(countries);//Выводсловарянаконсоль. 
//МетодAddвыбрасываетисключение, //еслиновыйключужесуществуетвсловаре. try { countries.Add(newCountry("Европа","Германия"),80780); } catch(ArgumentException) { Console.WriteLine("Элементсключом=\"Европа,Германия\" ужесуществует."); } //СвойствоItemпсевдонимдляиндексатора,такчтовы //можетеопускатьегоимя,когдаобращаетеськэлементамсловаря. Console.WriteLine("Дляключа=\"Европа,Франция\",значение={0}.", countries[newCountry("Европа","Франция")]); //Индексаторможноиспользоватьдляизменениязначения //связанногосключом. countries[newCountry("Европа","Франция")]=63929;
,
87
Console.WriteLine("Дляключа=\"Европа,Франция\",значение={0}.", countries[newCountry("Европа","Франция")]); //Еслиключосутствует,установкаиндексатораегозначением //добавляетновуюпаруключ/значение. countries[newCountry("Африка","Алжир")]=39666; //Индексаторвыбрасываетисключение,если //указанныйключотсутствуетвсловаре. try { Console.WriteLine("Дляключа=\"Африка,Ангола\",значение={0}.", countries[newCountry("Африка","Ангола")]); } catch { Console.WriteLine("Ключ=\"Африка,Ангола\"ненайден."); } //Еслипрограммачастозапрашиваетключи, //которыхможетнебытьвсловаре,методTryGetValue //можетбытьболееэффективнымсредствомизвлечениязначения. intvalue; if(countries.TryGetValue(newCountry("Африка","Ангола"),outvalue)) { Console.WriteLine("Дляключа=\"Африка,Ангола\",значение={0}.",value); } else { Console.WriteLine("Ключ=\"Африка,Ангола\"ненайден } //МетодContainsKeyможноиспользоватьдляпроверкиналичияключа //передеговставкой. if(!countries.ContainsKey(newCountry("Африка","Амбазония"))) { countries.Add(newCountry("Африка","Амбазония"),3521); Console.WriteLine("Значениедобавленопоключу=\"Африка,Амбазония\":{0}", countries[newCountry("Африка","Амбазония")]); } //Когдавыиспользуетеforeachдляпроходапоэлементамсловаря, //элементыизвлекаютсякакзначенияобъектаклассаKeyValuePair. Console.WriteLine(); foreach(KeyValuePair<Country,int>kvpincountries)  Console.WriteLine("Ключ={0:10},Значение={1:10}", kvp.Key,kvp.Value);
(KeyNotFoundException)
.");
{
88
} //Дляполучениятолькозначений,используйтесвойствоValues. SortedDictionary<Country,int>.ValueCollectionvalueColl= countries.Values; //ЭлементыValueCollectionимеюттип,которыйописандлязначенийсловаря. Console.WriteLine(); foreach(intvinvalueColl) { Console.WriteLine($"Значение={v}"); } //ДляполучениятолькоключейиспользуйтесвойствоKeys. SortedDictionary<Country,int>.KeyCollectionkeyColl= countries.Keys; //ЭлементыKeyCollectionимеюттип,которыйописандляключейсловаря. Console.WriteLine(); foreach(CountrykinkeyColl) { Console.WriteLine($"Ключ={k}"); } //ИспользуйтеметодRemove,чтобыудалитьпаруключ/значение. Console.WriteLine("\nRemove(\"Европа,Германия\")"); countries.Remove(newCountry("Европа","Германия")); if(!countries.ContainsKey(newCountry("Европа","Германия"))) { Console.WriteLine("Ключ\"Европа,Германия\"ненайден."); } Print(countries);//Выводсловарянаконсоль. } //Методдлявыводасловарянаконсоль. staticvoidPrint(IEnumerable<KeyValuePair<Country,int>>col) { Console.WriteLine(); foreach(var Console.WriteLine(el.ToString()); Console.WriteLine(); } } }  Результатработыпримра:
[Континент:Европа,страна:Франция,63920] [Континент:с.Америка,страна:Канада,34346] [Континент:с.Америка,страна:Мексика,111212] [Континент:с.Америка,страна:США,330000]
elincol)
89
Дляключа="Европа,Франция",значение=63920. Дляключа="Европа,Франция",значение=63929. Ключ="Африка,Ангола"ненайден. Ключ="Африка,Ангола"ненайден. Значениедобавленопоключу="Африка,Амбазония":3521  Ключ=Континент:Африка,страна:Алжир,Значение=139666 Ключ=Континент:Африка,страна:Амбазония,Значение=13521 Ключ=Континент:Европа,страна:Германия,Значение Ключ=Континент:Европа,страна:Франция,Значение=163929 Ключ=Континент:с.Америка,страна:Канада,Значение=134346 Ключ=Континент:с.Америка,страна:Мексика,Значение=1111212 Ключ=Континент:с.Америка,страна:США,Значение=1330000  Значение=39666 Значение=3521 Значение=80780 Значение=63929 Значение=34346 Значение=111212 Значение=330000  Ключ=Континент:Африка,страна:Алжир Ключ=Континент:Африка,страна:Амбазония Ключ=Континент:Европа,страна:Германия Ключ=Континент:Европа,страна:Франция Ключ=Континент:с.Америка,страна:Канада Ключ=Континент:с.Америка,страна:Мексика Ключ=Континент:с.Америка,страна:США  Remove("Европа,Германия") Ключ"Европа,Германия"ненайден. 
[Континент:Африка,страна:Алжир, [Континент:Африка,страна:Амбазония,3521] [Континент:Европа,страна:Франция,63929] [Континент:с.Америка,страна:Канада,34346] [Континент:с.Америка,страна:Мексика,111212] [Континент:с.Америка,страна:США,330000]
39666]
=180780
В следующем примере демонстрируется, каким образом с по-
мощью конструктора SortedDictionary(IDictionary<TKey, TValue> dic-
tionary, IComparer<TKey> comparer) создать новый сортированный
90
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]