Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Универсальные коллекции языка С#. Учебное пособие
.pdf
staticvoidMain(string[]args)
{
//Городамиллионники.Населениевтысячахчеловек.
//Создаетновыйсловарьцелыхчисел,состроковымиключами.
SortedDictionary<string,int>cyties=newSortedDictionary<string,int>()
{
{"Челябинск",1196},
{"Омск",1154},
{"Самара",1156},
{"Ростов‐на‐Дону",1137},
{"Уфа",1128},
};
Print(cyties,"Городамиллионники:");
//Добавляемнесколькоэлементовксловарю.Внихнедолжнобыть
//дубликатовключейсловаря,
//нонекоторыезначениямогутдублироваться
cyties.Add("Красноярск",1093);
cyties.Add("Пермь",1055);
//МетодAddmethodвыбрасываетисключение,
//еслиновыйключужеестьвсловаре.
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("Forkey=\"tif\",value={0}.",
cyties["Краснодар"]);
}
catch(KeyNotFoundException)
{
Console.WriteLine("Ключ=\"Краснодар\"несуществует.");
}
//Когдапрограммачастодолжназапрашиватьключи,которыхможет
//неоказатьсявсловаре,
//TryGetValueможетстатьболееэффективнымпутемизвлекатьзначения.
intvalue;
if(cyties.TryGetValue("",outvalue))
{
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>.ValueCollectionvalueColl=
cyties.Values;
\"Челябинск\",value={0}.",value);
kvpincyties)
82

//ЭлементыValueCollectionявляютсястроготипизированными
//стипомкоторыйбылописандлязначений(value)библиотеки.
Console.WriteLine();
foreach(intsinvalueColl)
{
Console.WriteLine("Value={0}",s);
}
//Чтобыполучитьтолькоключи,используйтесвойствоKeys.
SortedDictionary<string,int>.KeyCollectionkeyColl=
cyties.Keys;
//ЭлементыValueCollectionявляютсястроготипизированными
//стипомкоторыйбылописандлязначений(key)библиотеки.
Console.WriteLine();
foreach(stringsinkeyColl)
{
Console.WriteLine("Key={0}",s);
}
//UsetheRemovemethodtoremoveakey/valuepair.
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> –
СОРТИРОВАННЫЙ СЛОВАРЬ
Объекты класса Сортированный словарь реализуются в форме дерева бинарного поиска, в котором все элементы отсортированы на основе ключа. Тип ключа должен реализовывать интерфейс IComparable<TKey>. Если тип ключа не сортируемый, компаратор можно
также создать, реализовав IComparer<TKey> и указав его в качестве
аргумента конструктора сортированного словаря.
Классы SortedDictionary<TKey, Tvalue> и SortedList<TKey, TValue>
имеют сходную функциональность. Но
поскольку SortedList<TKey,
TValue> реализован в виде списка, основанного на массиве, a SortedDictionary<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, IComparer<TKey> comparer)
В первом конструкторе создается пустой словарь, во втором конструкторе – словарь с указанным количеством элементов dictionary.
В третьем конструкторе допускается указывать с помощью параметра
comparer типа IComparer<TKey> способ сравнения, используемый для
сортировки, а в четвертом конструкторе – инициализировать словарь,
помимо указания способа сравнения.
В следующем примере показывается, как с помощью сортированного
словаря обрабатывать объекты класса пользователя. Для примера
использован пользовательский класс Country, объекты которого содержат имя континента и имя страны. Значения, помещаемые в словарь, имеют тип int – это численность населения в тысячах человек.
85

Для того чтобы словарь мог выполнять операции над объектами,
в классе объектов реализован интерфейс IComparable<Country> с методом CompareTo(Country country), определяющим правило сравнения
объектов Country. В примере создается сортированный словарь SortedDictionary<Country, int> с ключом типа Country и значением типа int
и инициализируется тремя элементами, затем используется метод Add
для добавления элементов. Показано, что метод Add выбрасывает исключение ArgumentException при попытке
добавления повторяющего-
ся ключа.
Свойство Item[] используется для извлечения значений, демонстрируется, что исключение KeyNotFoundException возникает, когда
запрошенный ключ отсутствует, и показано, что значение, связанное
с ключом, можно заменить.
Демонстрируется использование метода TryGetValue как более эффективного способа получения значений, если программа часто пытается запрашивать значения ключей, которых нет в словаре, а также
показано, как использовать метод ContainsKey для проверки наличия
ключа перед вызовом метода Add.
Показано, как просмотреть ключи и значения в словаре, а также,
как просмотреть только ключи и только значения с помощью свойства
Keys и cвойства Values.
Демонстрируется использование метода Remove для удаления элемента по заданному ключу.
publicclassCountry:IComparable<Country>
{
publicstringContinent{get;}
publicstringName{get;}
publicCountry(stringcontinent,stringname)
{
Continent=continent;
Name=name;
}
publicoverridestringToString()
{
return$"Континент:{Continent,10},\tстрана:{Name,10}";
}
//Методдлясравненияобъектовкласса
publicintCompareTo(Countrycountry)
{
.
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=
newSortedDictionary<Country,int>(){
{newCountry("с.Америка","США"),330000},
{newCountry("с.Америка","Канада"),34346},
{newCountry("с.Америка","Мексика"),111212},
};
countries.Add(newCountry("Европа","Франция"),63920);//Ошибка.
Верное=63929
Print(countries);//Выводсловарянаконсоль.
//МетодAddвыбрасываетисключение,
//еслиновыйключужесуществуетвсловаре.
try
{
countries.Add(newCountry("Европа","Германия"),80780);
}
catch(ArgumentException)
{
Console.WriteLine("Элементсключом=\"Европа,Германия\"
ужесуществует.");
}
//СвойствоItemпсевдонимдляиндексатора,такчтовы
//можетеопускатьегоимя,когдаобращаетеськэлементамсловаря.
Console.WriteLine("Дляключа=\"Европа,Франция\",значение={0}.",
countries[newCountry("Европа","Франция")]);
//Индексаторможноиспользоватьдляизменениязначения
//связанногосключом.
countries[newCountry("Европа","Франция")]=63929;
,
87

Console.WriteLine("Дляключа=\"Европа,Франция\",значение={0}.",
countries[newCountry("Европа","Франция")]);
//Еслиключосутствует,установкаиндексатораегозначением
//добавляетновуюпаруключ/значение.
countries[newCountry("Африка","Алжир")]=39666;
//Индексаторвыбрасываетисключение,если
//указанныйключотсутствуетвсловаре.
try
{
Console.WriteLine("Дляключа=\"Африка,Ангола\",значение={0}.",
countries[newCountry("Африка","Ангола")]);
}
catch
{
Console.WriteLine("Ключ=\"Африка,Ангола\"ненайден.");
}
//Еслипрограммачастозапрашиваетключи,
//которыхможетнебытьвсловаре,методTryGetValue
//можетбытьболееэффективнымсредствомизвлечениязначения.
intvalue;
if(countries.TryGetValue(newCountry("Африка","Ангола"),outvalue))
{
Console.WriteLine("Дляключа=\"Африка,Ангола\",значение={0}.",value);
}
else
{
Console.WriteLine("Ключ=\"Африка,Ангола\"ненайден
}
//МетодContainsKeyможноиспользоватьдляпроверкиналичияключа
//передеговставкой.
if(!countries.ContainsKey(newCountry("Африка","Амбазония")))
{
countries.Add(newCountry("Африка","Амбазония"),3521);
Console.WriteLine("Значениедобавленопоключу=\"Африка,Амбазония\":{0}",
countries[newCountry("Африка","Амбазония")]);
}
//Когдавыиспользуетеforeachдляпроходапоэлементамсловаря,
//элементыизвлекаютсякакзначенияобъектаклассаKeyValuePair.
Console.WriteLine();
foreach(KeyValuePair<Country,int>kvpincountries)
Console.WriteLine("Ключ={0:10},Значение={1:10}",
kvp.Key,kvp.Value);
(KeyNotFoundException)
.");
{
88

}
//Дляполучениятолькозначений,используйтесвойствоValues.
SortedDictionary<Country,int>.ValueCollectionvalueColl=
countries.Values;
//ЭлементыValueCollectionимеюттип,которыйописандлязначенийсловаря.
Console.WriteLine();
foreach(intvinvalueColl)
{
Console.WriteLine($"Значение={v}");
}
//ДляполучениятолькоключейиспользуйтесвойствоKeys.
SortedDictionary<Country,int>.KeyCollectionkeyColl=
countries.Keys;
//ЭлементыKeyCollectionимеюттип,которыйописандляключейсловаря.
Console.WriteLine();
foreach(CountrykinkeyColl)
{
Console.WriteLine($"Ключ={k}");
}
//ИспользуйтеметодRemove,чтобыудалитьпаруключ/значение.
Console.WriteLine("\nRemove(\"Европа,Германия\")");
countries.Remove(newCountry("Европа","Германия"));
if(!countries.ContainsKey(newCountry("Европа","Германия")))
{
Console.WriteLine("Ключ\"Европа,Германия\"ненайден.");
}
Print(countries);//Выводсловарянаконсоль.
}
//Методдлявыводасловарянаконсоль.
staticvoidPrint(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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
