Речници (Асоциативни Масиви) за 15 минути C#



Речници (Асоциативни Масиви) за 15 минути C#

Речници (Асоциативни Масиви) за 15 минути C#

Повече как работят колекциите вижте на:
1. Масиви – https://www.youtube.com/watch?v=wXGKIau1uwU
2. Листове – https://www.youtube.com/watch?v=4dm0_e9ERrs

Днешната тема не е многа трудна за свързване с нещо познато ни от ежедневието. Самото име ни подсказва за речници –
Как работим с речника. Искаме да си преведем дума от английски на български – да качем искаме да си преведем думата dog.
Какво правим в речника – отиваме на буквата d и започваме да търсим думата dog. Намираме я – това е нашия ключ към знанието за това какво седи срещу нея.
Съответно срещу ключа ни седи стойност, която е “Куче”. Неразделно във всеки речник имаме тази английски българска ДВОЙКА – dog: куче. Нека буквално да направим това в нашия код.
За да можем да работим с колекции трябва както при листовете да добавим:

using System.Collections.Generic;

Dictionary&ltstring, string&gt englishBulgarianDict = new Dictionary&ltstring, string&gt();
Тук, тъй като C# е типизиран трябва да определим какъв тип е ключа и какъв тип е стойността в нашия случай и двете са низ от символи и това ясно говори за стрингове.

Какво знаем вече от листовете, всяка колекция си има своите методи. Тук имаме за добавяне също. Вижте какво ни казва метода: Примемам две неща – key and value.

englishBulgarianDict.Add(“dog”, “куче”);

В нашия си речник вече имаме написана една двойка. Нека добавим още няколко лесни думи и да видим какво можем да правим с тях.

Как можем да се разходим в колекция? Знаем от листа, че най-лесно ако искаме само да я разгледаме става с foreach:

foreach (var item in englishBulgarianDict)
{
Console.WriteLine(item);
}

Тук, обаче, с това разписване не ни стана много ясно какъв е типа на променливата item. Това е неразделна двойка на ключ и стойност. Буквално това което казахме – KeyValuePair. Дори да сменим var продължава да се подчертава в червено и това е защото трябва да кажем акъв е типа на ключа и какъв на стойността – в нашия случай два стринга:

foreach (KeyValuePair &ltstring, string&gt item in englishBulgarianDict)
{
Console.WriteLine(item);
}

Резултатът е както виждаме нераздела двойка от ключ и стойност:

[dog, куче]
[cat, котка]
[chair, стол]
[hello, здравей]

Но как все пак можем да взмем само ключа? Слагаме . и виждаме както .Key, така и . Value. Нека видим как може да ги използваме:
Console.WriteLine($”The word {item.Key} in bulgarian is {item.Value}”);

Какво ще се случи, ако повторим един и същи ключ два пъти?
englishBulgarianDict.Add(“hello”, “здравей”);
englishBulgarianDict.Add(“hello”, “непозната дума”);

System.ArgumentException: An item with the same key has already been added.

Тази грешка ни показва, че ключовете в тази структура трябва да са уникални! Ако искаме да сменим стойността на този ключ, защото смятаме че тя вече не е релевантна можем да го направим по следния начин:

englishBulgarianDict.Add(“hello”, “здравей”);

englishBulgarianDict[“hello”] = “no word here”;

С този синтаксис буквално казваме: на мястото на това, което е стояло СРЕЩУ hello до сега запиши вече нова стойност кято е “no word here”

Какво ще стане, ако сложим например обаче невалиден ключ – да кажем че искаме да сменим стойността на ключа “go”, който не сме дефинирали в нашия речниик и направим така :
englishBulgarianDict[“go”] = “no word here”;

С изненада установяваме, че не е грешка а е още един синтаксис за добавяне на ключ и стойност.

Как можем да разберем дали някой ключ въобще го има в речника?

if (englishBulgarianDict.ContainsKey(“hello”))
{
Console.WriteLine(“Yes”);
}

(CASE SENSITIVE!)

Имаме и познатите ни от листовете метод Remove, както и Count.

Как можем да сортираме, обаче, по азбучен ред речника по ключ?

foreach (var item in englishBulgarianDict.OrderBy(x =&gt x.Key))
{
Console.WriteLine(item);
}

Ето как би изглеждал и един по-интересен пример с колекция в колекцията:

Dictionary&ltstring, List&ltint&gt&gt grades = new Dictionary&ltstring, List&ltint&gt&gt();

grades[“Maria”] = new List&ltint&gt() { 6, 6, 5 };
grades[“Gosho”] = new List&ltint&gt() { 2,6,6 };

foreach (var item in grades)
{
Console.Write(“Maria has – “);

Console.WriteLine(string.Join(“, “, item.Value));
}

Comments are closed.