Słów kilka o słownikach( Dictionary) w C#

in pl-artykuly •  6 years ago  (edited)

Rozważmy prosty kod C#, którego celem jest wyświetlanie danych, zależnych od słowa-klucza. Niech kluczem będzie nazwa jaką zapiszemy w zmiennej typu string:
String name;
Niech to będzie kilka imion np
Jan,Marta,Filip.
Zależnie od zawartości zmiennej wywoływana ma być odpowiednia metoda wyświetlającą szczegóły.
Zadanie banalne, najprościej napisać kilka warunków w celu realizacji tego co chcemy:

Show show= new Show();
If (name == „Jan”)
{
    show.Jan()
}
Else if(name ==„Marta”)
{
show.Marta()
}
Else if(name==„Filip”)
{
show.Filip()
}

Jak widać sprawdzamy zawartość zmiennej name i dla każdej możliwości wywołujemy metodę obiektu klasy Show. Wyglada ona w tym wypadku tak:

Class Show
{
public Filip()
{
Console.WriteLine(„dane Filipa”);
}

public Marta()
{
Console.WriteLine(„dane Marty”);
}

public Jan()
{
Console.WriteLine(„dane Jana”);
}
}

Wszystko działa i z pozoru nie ma nad czym deliberować. Co jednak jeśli przybędzie nam imion i danych? Dodanie 100 nazw spowoduje konieczność dodania 100 warunków w naszym kodzie, co nie będzie wyglądało zbyt elegancko, ani czytelnie. Można by zamiast if i else if użyć switch i case, ale niewiele to w tym wypadku zmienia. Co jeszcze wiec można zrobić? Użyć słownika!
W naszym wypadku kluczem w słowniku będzie napis string. Chcemy aby klucz o wybranej nazwie umożliwiał wywołanie odpowiadającej mu metody obiektu show. W związku z tym wygodnie będzie, aby wartością wskazywaną przez klucz typu string w naszym słowniku był interfejs, zawierający metodę Show().

Dictionary <string,IDataShowable> dataDict;

Dla wygody wyciągnijmy sobie ten słownik do innej klasy o nazwie Dict:

Dict dict = new Dict();
dict.dataDict["Jan"].Show();

Teraz możemy wywoływać metodę odpowiadającą danemu name, bez użycia warunków. W przypadku nowych nazw, wystarczy dodać do naszego słownika odpowiednie klucze i wskazać odpowiednie klasy implementujące nasz interfejs IDataShowable.
A oto nasz interfejs:

Interface IDataShowable
{
     void Show();
}

Teraz,mając interfejs wystarczy dla wybranego name stworzyć sobie klasę, jaka go implementuje, a w metodzie Show() takiej klasy, pokazać szczegóły w dowolny dla danego wyboru sposób. Dla Jana np niech zaśpiewa, dla Marty wyświetli a dla Filipa wydrukuje...kwestia inwencji;)

Jak widać, warto korzystać z dobrodziejstw płynących z użycia słowników(i interfejsów rzecz jasna też).
Poniżej kompletny kod C# omawianego zagadnienia. Zachęcam do jego analizy:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace UseDict
{
    class Program
    {
        static void Main(string[] args)
        {
    Dict dict = new Dict();
    dict.dataDict["Jan"].Show();
            
        }
    }

class Dict
{

   public Dictionary<string,IDataShowable> dataDict;
    public Dict()
    {
        dataDict = new Dictionary<string,IDataShowable>()
    {
    {"Jan",new Jan()},
    {"Marta",new Marta()},
    {"Filip",new Filip()}
        
    };
    }
}

interface IDataShowable
{
     void Show();
}

class Filip: IDataShowable
{
    public void Show()
    {
        Console.WriteLine("dane Filipa");       
    }
    
}

class Marta: IDataShowable
{
    public void Show()
    {
        Console.WriteLine("dane Marty");    
        
    }   
}

class Jan:IDataShowable
{
    public void Show()
    {
        Console.WriteLine("dane Jana"); 
    }
    
}
}

Życzę wszystkim powodzenia!:)

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!