Добрый день! Сегодня я решил помочь разобраться с классом Dictionary словарями. Научиться ими пользоваться и применять в своих приложениях. По сути словари это обычные коллекция, практически ничем не отличается от List, однако это не совсем так. Разница у них все же есть, к примеру при добавлении в List данных смещаются, получая свой индекс. Со словарями тут иначе, у них нет индекса так токового, у них есть ключи Key и значение эти ключей. Ключем может быть как текст, так и символ и цифры. Создание и использование словарей может имеет несколько вариаций, рассмотрим их.
Создаем ключи в словаре и вносим в них значения:
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:
foreach (string key in dictionary.Keys)
{
Console.WriteLine(dictionary[key]);
}
Еще один вариант инициализации:
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);
}
Еще один вариант инициализации путем создания динамически анонимного типа данных:
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(), рассмотрим их:
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(); Для этого в методе необходимо указать название ключа, после чего произойдет удаление..
dictionary.Remove("Five");
Часто применяют словари в следующих типах задач. Когда у нас есть массив строк, нам надо найти дубликаты заданной строки и вывести результат, этого не сделать к примеру с помощью массива, но легко сделать можно с помощью Dictionary. Еще одним классическим вариантом является такая вариация. Когда надо произвести соответствие к примеру по id или названию.
Рассмотрим пример дан массив строк, посчитать количество одинаковых строк в массиве.
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
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();
}
Вывод:
P Pavel P Peter A Andrew A Anna A Alice J John
