Кроме того, класс содержит три собственных свойства:
Values – возвращает значение из структуры элемента;
Keys – возвращает ключ;
Comparer – указывает компаратор (метод сравнения);
Для автоматического добавления новых пар в коллекцию в классе предусмотрен индексатор. Но работает он не на основе индекса, а на основе ключа. Вот его сигнатура:
public TValue this[TKey] { get; set;}
При использовании он работает с парами значение/ключ как со структурой KeyValuePair.
Использование свойств и методов класса демонстрируется в следующем примере:
using System;
using System.Collections.Generic;
public class DictionaryExample
{
public static void Main()
{
// Создаем коллекцию из пар ключ/значение – оба типа string.
Dictionary<string, string> FileAssos =
new Dictionary<string, string>();
// Добавляем элементы в коллекцию.
FileAssos.Add("txt", "notepad.exe");
FileAssos.Add("rar", "winrar.exe");
FileAssos.Add("jpg", "photoshop.exe");
FileAssos.Add("docx", "winword.exe");
// Следующая строка кода вызовет исключение. Поскольку с ключом rar ассоциировано значение winrar.
try
{
FileAssos.Add("rar", "winzip.exe");
}
catch (ArgumentException)
{
Console.WriteLine("Элемент с ключом = \"rar\" уже присутствует в коллекции.");
}
// Получаем доступ через индексатор.
Console.WriteLine("Для ключа = \"jpg\", значение = {0}.",
FileAssos["jpg"]);
// Используем индексатор для изменения значения в ассоциированной с ключом.
FileAssos["jpg"] = "Paint.exe";
Console.WriteLine("Для ключа= \"jpg\", значение = {0}.",
FileAssos["jpg"]);
// используем индексатор для добавления нового значения элемента коллекции, в виде структуры KeyValuePair.
FileAssos["cfg"] = "cfgreader.exe";
// С помощью индексатора обращаемся к коллекции по несуществующему ключу. Будет сгенерировано исключение.
try
{
Console.WriteLine("Для ключа = \"xls\", значение = {0}.",
FileAssos["xls"]);
}
catch (KeyNotFoundException)
{
Console.WriteLine("Ключ = \"xls\" не был найден в коллекции.");
}
// Получаем значение из структуры KeyValuePair по ключу с помощью метода TryGetValue.
string value = "";
if (FileAssos.TryGetValue("xls", out value))
{
Console.WriteLine("Для ключа = \"xls\", значение = {0}.", value);
}
else
{
Console.WriteLine("Ключ = \"xls\" не найден.");
}
// Чтобы проверить вхождение ключа в коллекцию перед добавлением, следует использовать метод ContainsKey.
if (!FileAssos.ContainsKey("ht"))
{
FileAssos.Add("mp3", "aimp.exe");
Console.WriteLine("Значение добавлено по ключу = \"mp3\": {0}",
FileAssos["mp3"]);
}
// При использовании конструкции foreach для перебора элементов словаря в качестве обьектов используется структура KeyValuePair.
Console.WriteLine();
foreach( KeyValuePair<string, string> element in FileAssos )
{
Console.WriteLine("Ключ = {0}, Значение = {1}",
element.Key, element.Value);
}
// Чтобы получить список всех значений коллекции нужно использовать свойство Values.
Dictionary<string, string>.ValueCollection TempvaluesColl =
FileAssos.Values;
Console.WriteLine();
foreach( string str in TempvaluesColl )
{
Console.WriteLine("Все значения из словаря: {0}", str);
}
// Чтобы получить список всех ключей коллекции нужно использовать свойство Keys.
Dictionary<string, string>.KeyCollection TempkeysColl =
FileAssos.Keys;
Console.WriteLine();
foreach( string str in TempkeysColl )
{
Console.WriteLine("Ключ = {0}", str);
}
// Используем метод Remove для удаления элемента по ключу.
Console.WriteLine("\nУдаляем(\"rar\")");
FileAssos.Remove("rar");
if (!FileAssos.ContainsKey("rar"))
{
Console.WriteLine("Ключ \"rar\" не найден.");
}
}
}
Еще один распространенный тип коллекции представляют словари. Словарь хранит объекты, которые представляют пару ключ-значение. Каждый такой объект является объектом структуры KeyValuePair. Благодаря свойствам Key и Value, которые есть у данной структуры, мы можем получить ключ и значение элемента в словаре.
Рассмотрим на примере использование словарей:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
Dictionary countries = new Dictionary(5);
countries.Add(1, "Russia");
countries.Add(3, "Great Britain");
countries.Add(2, "USA");
countries.Add(4, "France");
countries.Add(5, "China");
foreach (KeyValuePair keyValue in countries)
{
Console.WriteLine(keyValue.Key + " - " + keyValue.Value);
}
// получение элемента по ключу
string country = countries[4];
// изменение объекта
countries[4] = "Spain";
// удаление по ключу
countries.Remove(2);
|
Класс словарей также, как и другие коллекции, предоставляет методы Add и Remove для добавления и удаления элементов. Только в случае словарей в метод Add передаются два параметра: ключ и значение. А метод Remove удаляет не по индексу, а по ключу.
Так как в нашем примере ключами является объекты типа int, а значениями - объекты типа string, то словарь в нашем случае будет хранить объекты KeyValuePair. В цикле foreach мы их можем получить и извлечь из них ключ и значение.
Кроме того, мы можем получить отдельно коллекции ключей и значений словаря:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
Dictionary people = new Dictionary();
people.Add('b', new Person() { Name = "Bill" });
people.Add('t', new Person() { Name = "Tom" });
people.Add('j', new Person() { Name = "John" });
foreach (KeyValuePair keyValue in people)
{
// keyValue.Value представляет класс Person
Console.WriteLine(keyValue.Key + " - " + keyValue.Value.Name);
}
// перебор ключей
foreach (char c in people.Keys)
{
Console.WriteLine(c);
}
// перебор по значениям
foreach (Person p in people.Values)
{
Console.WriteLine(p.Name);
}
|
Здесь в качестве ключей выступают объекты типа char, а значениями - объекты Person. Используя свойство Keys, мы можем получить ключи словаря, а свойство Values соответственно хранит все значения в словаре.
Для добавления необязательно применять метод Add(), можно использовать сокращенный вариант:
1
2
3
|
Dictionary people = new Dictionary();
people.Add('b', new Person() { Name = "Bill" });
people['a'] = new Person() { Name = "Alice" };
|
Несмотря на то, что изначально в словаре нет ключа 'a' и соответствующего ему элемента, то он все равно будет установлен. Если же он есть, то элемент по ключу 'a' будет заменен на новый объект new Person() { Name = "Alice" }
Do'stlaringiz bilan baham: |