Работа со словарями Dictionary

Добрый день! Сегодня я решил помочь разобраться с классом 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

 

 

Обновлено: 22.05.2018 — 13:28

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.