Добрый день! Сегодня я решил помочь разобраться с классом Dictionary словарями. Научиться ими пользоваться и применять в своих приложениях. По сути словари это обычные коллекция, практически ничем не отличается от List, однако это не совсем так. Разница у них все же есть, к примеру при добавлении в List данных смещаются, получая свой индекс. Со словарями тут иначе, у них нет индекса так токового, у них есть ключи Key и значение эти ключей. Ключем может быть как текст, так и символ и цифры. Создание и использование словарей может имеет несколько вариаций, рассмотрим их.
Создаем ключи в словаре и вносим в них значения:
1 2 3 4 5 6 7 |
var dictionary = new Dictionary<string, int>(); dictionary.Add("One", 1); dictionary.Add("Two", 2); dictionary.Add("Three",3); dictionary.Add("Four", 4); dictionary.Add("Five" ,5); |
На этом все, мы создали словарь с ключами и поместили в них значения, теперь их можно вывести с помощью foreach:
An error has occurred. Please try again later. |
Еще один вариант инициализации:
1 2 3 4 5 6 7 8 9 10 11 12 |
Dictionary<string, string> dictionary = new Dictionary<string, string> { ["I like nookery"] = "Я люблю nookery", ["cool"] = "клевый", ["site"] = "cайт" }; //выводим содержимое пары ключ-значение foreach (var dic in dictionary) { Console.WriteLine("{0} - {1}", dic.Key, dic.Value); } |
Еще один вариант инициализации путем создания динамически анонимного типа данных:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
var dictionary = new Dictionary<dynamic, dynamic> { {new {Key = "table"}, new {Value="стол"}}, {new {Key = "apple"}, new {Value="яблоко"}}, {new {Key = "pen"}, new {Value="ручка"}}, {new {Key = "pencil"}, new {Value="карандаш"}}, {new {Key = "task"}, new {Value="задание"}}, {new {Key = "key"}, new {Value="ключ"}}, {new {Key = "customer"}, new {Value="покупатель"}}, {new {Key = "ship"}, new {Value="корабль"}}, {new {Key = "car"}, new {Value="машина"}}, {new {Key = "cap"}, new {Value="чашка"}} }; |
Одной из основных ошибок которые встречаются у тех кто использует словари, при попытке создать ключ, которые уже имеется в словаря вызывает ошибку так называемые коллизии, для этого нужно использовать способы их отловить с помощью метода ContainsKey(), рассмотрим их:
1 2 3 4 5 6 7 8 9 10 11 |
var dictionary = new Dictionary<string, int>(); dictionary.Add("One", 1); dictionary.Add("Two", 2); dictionary.Add("Three",3); dictionary.Add("Four", 4); dictionary.Add("Five" ,5); dictionary.Add("six", 65); // dictionary.Add("six", 6); Будет ошибка, так как ключ с именем six уже существует if (dictionary.ContainsKey("six")) dictionary["six"] = 6; |
Мы сделали проверку на существование в словаре такого ключа, и просто изменили в нем значение на новое.
Удаление одного из значений в месте с ключем происходит с помощью метода Remove(); Для этого в методе необходимо указать название ключа, после чего произойдет удаление..
1 |
dictionary.Remove("Five"); |
Часто применяют словари в следующих типах задач. Когда у нас есть массив строк, нам надо найти дубликаты заданной строки и вывести результат, этого не сделать к примеру с помощью массива, но легко сделать можно с помощью Dictionary. Еще одним классическим вариантом является такая вариация. Когда надо произвести соответствие к примеру по id или названию.
Рассмотрим пример дан массив строк, посчитать количество одинаковых строк в массиве.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
var array = new[] { "nookery", "it's", "fun!", "Cool", "Site", "C#", "nookery"}; var dictionary = new Dictionary<string, int>(); foreach (var e in array) { if (!dictionary.ContainsKey(e)) dictionary[e] = 0; dictionary[e]++; } foreach (var e in dictionary) { Console.WriteLine(e.Key + "\t" + e.Value); } |
Нередко встречается необходимость, сгруппировав элементы, преобразовать их в структуру данных для поиска группы по ключу группировки. Для этого воспользуемся самым оптимальным решением с помощью LINQ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
static void Main(string[] args) { string[] names = { "Pavel", "Peter", "Andrew", "Anna", "Alice", "John" }; Dictionary<char, List<string>> namesByLetter = names .GroupBy(name => name[0]) .ToDictionary(group => group.Key, group => group.ToList()); foreach (var i in namesByLetter) { for (int n = 0; n < i.Value.Count; n++) { Console.WriteLine(i.Key + " " + i.Value[n]); } } Console.ReadKey(); } |
Вывод:
1 2 3 4 5 6 |
P Pavel P Peter A Andrew A Anna A Alice J John |