Τι είναι το Dictionary;

Ένα Dictionary στην C# είναι σαν ένα κουτί που μπορεί να αποθηκεύει ζευγάρια από κλειδιά και τιμές. Το κλειδί είναι κάτι μοναδικό, και το χρησιμοποιείς για να βρεις την αντίστοιχη τιμή. Σκέψου το σαν ένα βιβλίο με λέξεις και εξηγήσεις (σαν ένα λεξικό – εξού και το όνομα “Dictionary”).

Για παράδειγμα, μπορείς να έχεις ένα Dictionary που να αποθηκεύει τις αγαπημένες τροφές κάθε φίλου σου. Το κλειδί θα είναι το όνομα του φίλου, και η τιμή θα είναι η αγαπημένη του τροφή.

Πώς λειτουργεί;

  • Το κλειδί (Key) είναι κάτι μοναδικό που χρησιμοποιείς για να βρεις την αντίστοιχη πληροφορία.
  • Η τιμή (Value) είναι η πληροφορία που σχετίζεται με αυτό το κλειδί.

Παράδειγμα:

Ας φανταστούμε ότι θέλεις να φτιάξεις ένα Dictionary για να αποθηκεύσεις τις αγαπημένες τροφές των φίλων σου.

// Δημιουργία ενός Dictionary
Dictionary<string, string> favoriteFoods = new Dictionary<string, string>();

// Προσθήκη δεδομένων (κλειδιά και τιμές)
favoriteFoods.Add("Γιάννης", "Πίτσα");
favoriteFoods.Add("Μαρία", "Σουβλάκι");
favoriteFoods.Add("Κώστας", "Σαλάτα");

// Αναζήτηση της αγαπημένης τροφής του Γιάννη
Console.WriteLine("Η αγαπημένη τροφή του Γιάννη είναι " + favoriteFoods["Γιάννης"]);

Τι σημαίνει αυτό:

  1. Δημιουργία Dictionary: Στο πρώτο κομμάτι του κώδικα, φτιάξαμε ένα Dictionary που θα αποθηκεύει ονόματα (κλειδιά) και αγαπημένες τροφές (τιμές). Η λέξη Dictionary<string, string> σημαίνει ότι το κλειδί και η τιμή είναι και τα δύο τύπου string (δηλαδή, αλφαριθμητικά, όπως λέξεις ή προτάσεις).
  2. Προσθήκη κλειδιών και τιμών: Στη συνέχεια, προσθέσαμε μερικά ζευγάρια από κλειδιά και τιμές. Για παράδειγμα:
    • Το κλειδί “Γιάννης” αντιστοιχεί στην τιμή “Πίτσα”.
    • Το κλειδί “Μαρία” αντιστοιχεί στην τιμή “Σουβλάκι”.
  3. Αναζήτηση τιμής με το κλειδί: Όταν θέλεις να βρεις την αγαπημένη τροφή κάποιου, χρησιμοποιείς το όνομά του ως κλειδί. Στο παράδειγμα, ζητάμε το κλειδί “Γιάννης”, και το πρόγραμμα μας δείχνει την τιμή που είναι “Πίτσα”.

Πλεονεκτήματα των Dictionaries

  1. Γρήγορη αναζήτηση: Αντί να ψάχνεις ένα-ένα τα δεδομένα, μπορείς να βρεις την πληροφορία που θέλεις αμέσως, απλά με το κλειδί.
  2. Μοναδικά κλειδιά: Κάθε κλειδί στο Dictionary πρέπει να είναι μοναδικό. Για παράδειγμα, δεν μπορείς να έχεις δύο φορές το όνομα “Γιάννης” με διαφορετικές τιμές.
  3. Χρήσιμο για ομαδοποιημένα δεδομένα: Είναι πολύ βολικό όταν έχεις δεδομένα που έρχονται σε ζεύγη, όπως τα ονόματα και τις αγαπημένες τροφές, ή τα ονόματα και τους αριθμούς τηλεφώνου.

Ας δούμε ένα ακόμα παράδειγμα:

Σκέψου ότι έχεις ένα Dictionary που αποθηκεύει την ηλικία των φίλων σου.

// Δημιουργία ενός Dictionary για ονόματα και ηλικίες
Dictionary<string, int> ages = new Dictionary<string, int>();

// Προσθήκη δεδομένων
ages.Add("Γιάννης", 25);
ages.Add("Μαρία", 22);
ages.Add("Κώστας", 30);

// Αναζήτηση ηλικίας
Console.WriteLine("Ο Γιάννης είναι " + ages["Γιάννης"] + " χρονών.");

Τι μάθαμε από αυτό το παράδειγμα:

  • Αυτή τη φορά, χρησιμοποιήσαμε ένα Dictionary<string, int>, όπου το κλειδί είναι τύπου string (το όνομα), και η τιμή είναι τύπου int (η ηλικία).
  • Με το ages["Γιάννης"], το πρόγραμμα μας επιστρέφει την ηλικία του Γιάννη.

Αναλυτικότερα για τα Dictionaries:

  1. Προσθήκη Στοιχείων: Όπως είδαμε, μπορείς να προσθέσεις στοιχεία (ζευγάρια κλειδιού και τιμής) στο Dictionary χρησιμοποιώντας τη μέθοδο Add(). Μια άλλη επιλογή είναι να προσθέσεις απευθείας ένα στοιχείο χωρίς να χρησιμοποιήσεις το Add():
Dictionary<string, string> favoriteFoods = new Dictionary<string, string>();

// Προσθήκη χωρίς Add()
favoriteFoods["Ελένη"] = "Μακαρόνια";

Στην παραπάνω περίπτωση, το Dictionary καταχωρεί ως κλειδί το όνομα “Ελένη” και ως τιμή την αγαπημένη της τροφή “Μακαρόνια”. Αυτός είναι ένας πιο σύντομος τρόπος να προσθέσεις ή να ενημερώσεις δεδομένα.

Έλεγχος Αν Κλειδί Υπάρχει: Κάποιες φορές, μπορεί να θέλεις να ελέγξεις αν υπάρχει ένα κλειδί στο Dictionary πριν προσθέσεις ή ζητήσεις δεδομένα. Για αυτό μπορείς να χρησιμοποιήσεις τη μέθοδο ContainsKey():

if (favoriteFoods.ContainsKey("Γιάννης"))
{
    Console.WriteLine("Η αγαπημένη τροφή του Γιάννη είναι: " + favoriteFoods["Γιάννης"]);
}
else
{
    Console.WriteLine("Δεν γνωρίζουμε την αγαπημένη τροφή του Γιάννη.");
}

Η μέθοδος ContainsKey() επιστρέφει true ή false, ανάλογα με το αν υπάρχει ή όχι το συγκεκριμένο κλειδί στο Dictionary. Αυτό είναι χρήσιμο για να αποφεύγεις σφάλματα αν προσπαθείς να βρεις μια τιμή για ένα κλειδί που δεν υπάρχει.

Αφαίρεση Στοιχείων: Αν θελήσεις να αφαιρέσεις ένα ζευγάρι κλειδιού-τιμής από το Dictionary, μπορείς να χρησιμοποιήσεις τη μέθοδο Remove():

favoriteFoods.Remove("Μαρία");

Αυτό αφαιρεί το κλειδί “Μαρία” και την τιμή της από το Dictionary.

Διατήρηση Πλήθους Στοιχείων: Μπορείς επίσης να δεις πόσα ζευγάρια κλειδιών και τιμών έχει το Dictionary χρησιμοποιώντας την ιδιότητα Count:

Console.WriteLine("Το Dictionary έχει " + favoriteFoods.Count + " στοιχεία.");

Αυτή η εντολή σου λέει πόσα στοιχεία περιέχει το Dictionary εκείνη τη στιγμή.

Πρόσβαση σε Όλα τα Κλειδιά και τις Τιμές: Μπορείς να πάρεις όλα τα κλειδιά ή όλες τις τιμές από το Dictionary και να τα εκτυπώσεις, αν θέλεις να δεις τι περιέχει. Για να το κάνεις αυτό, χρησιμοποιείς τις ιδιότητες Keys και Values.

// Εκτύπωση όλων των κλειδιών
foreach (string key in favoriteFoods.Keys)
{
    Console.WriteLine("Όνομα: " + key);
}

// Εκτύπωση όλων των τιμών
foreach (string value in favoriteFoods.Values)
{
    Console.WriteLine("Αγαπημένη τροφή: " + value);
}

Ενημέρωση Τιμής για Υπάρχον Κλειδί: Αν θέλεις να αλλάξεις την τιμή για ένα συγκεκριμένο κλειδί, μπορείς απλώς να το κάνεις απευθείας:

favoriteFoods["Γιάννης"] = "Σουβλάκι";

Τώρα, η αγαπημένη τροφή του Γιάννη από “Πίτσα” γίνεται “Σουβλάκι”. Δεν χρειάζεται να χρησιμοποιήσεις την Add(), απλώς γράφεις το νέο δεδομένο απευθείας.

Παράδειγμα με Dictionary και Αριθμούς: Μπορείς να χρησιμοποιήσεις ένα Dictionary όχι μόνο με λέξεις, αλλά και με αριθμούς, ημερομηνίες, και πολλούς άλλους τύπους δεδομένων.

Παράδειγμα με αριθμούς:

Dictionary<string, int> studentGrades = new Dictionary<string, int>();

studentGrades.Add("Αλέξανδρος", 85);
studentGrades.Add("Κατερίνα", 92);
studentGrades.Add("Νίκος", 78);

Console.WriteLine("Ο βαθμός του Αλέξανδρου είναι: " + studentGrades["Αλέξανδρος"]);
  1. Εδώ, το κλειδί είναι το όνομα του μαθητή και η τιμή είναι ο βαθμός του. Μπορείς εύκολα να βρεις τους βαθμούς των μαθητών με τα ονόματά τους.

Γιατί είναι χρήσιμα τα Dictionaries;

Τα Dictionaries είναι πολύ ισχυρά γιατί σου επιτρέπουν να βρεις γρήγορα πληροφορίες όταν γνωρίζεις το κλειδί. Αντί να ψάχνεις ανάμεσα σε όλα τα στοιχεία για να βρεις αυτό που θέλεις, μπορείς απλώς να χρησιμοποιήσεις το κλειδί και να πάρεις αμέσως την τιμή.

  • Παράδειγμα στη ζωή: Σκέψου ένα τηλεφωνικό κατάλογο. Αν θέλεις να βρεις τον αριθμό τηλεφώνου κάποιου, απλά ψάχνεις το όνομά του (το κλειδί) και αμέσως βρίσκεις τον αριθμό του (την τιμή). Αυτός είναι ο τρόπος που δουλεύουν τα Dictionaries!

Παράδειγμα: Κατάστημα με Προϊόντα και Τιμές

Σκέψου ότι έχεις ένα κατάστημα και θέλεις να φτιάξεις ένα πρόγραμμα για να διαχειρίζεσαι τα προϊόντα και τις τιμές τους. Κάθε προϊόν έχει μια συγκεκριμένη τιμή. Χρησιμοποιώντας ένα Dictionary, μπορείς να αποθηκεύσεις τα ονόματα των προϊόντων ως κλειδιά και τις τιμές τους ως τιμές. Έτσι, θα μπορείς εύκολα να βρίσκεις την τιμή ενός προϊόντος με βάση το όνομά του.

Πώς θα δουλεύει το project:

  • Το κλειδί στο Dictionary θα είναι το όνομα του προϊόντος.
  • Η τιμή στο Dictionary θα είναι η τιμή του προϊόντος.

Παράδειγμα κώδικα:

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        // Δημιουργία ενός Dictionary για προϊόντα και τιμές
        Dictionary<string, double> productPrices = new Dictionary<string, double>();

        // Προσθήκη προϊόντων και τιμών
        productPrices.Add("Μήλα", 1.20);
        productPrices.Add("Πορτοκάλια", 0.90);
        productPrices.Add("Γάλα", 2.50);
        productPrices.Add("Ψωμί", 1.00);

        // Εμφάνιση τιμής ενός προϊόντος
        Console.WriteLine("Η τιμή των Μήλων είναι: " + productPrices["Μήλα"] + " €");

        // Προσθήκη νέου προϊόντος
        productPrices["Αυγά"] = 3.00;
        Console.WriteLine("Η τιμή των Αυγών είναι: " + productPrices["Αυγά"] + " €");

        // Αφαίρεση προϊόντος
        productPrices.Remove("Γάλα");

        // Έλεγχος αν το προϊόν υπάρχει
        if (productPrices.ContainsKey("Γάλα"))
        {
            Console.WriteLine("Η τιμή του Γάλακτος είναι: " + productPrices["Γάλα"] + " €");
        }
        else
        {
            Console.WriteLine("Το προϊόν 'Γάλα' δεν υπάρχει στο κατάστημα.");
        }

        // Εμφάνιση όλων των προϊόντων και τιμών
        Console.WriteLine("Λίστα προϊόντων και τιμών:");
        foreach (var product in productPrices)
        {
            Console.WriteLine(product.Key + ": " + product.Value + " €");
        }
    }
}

Τι κάνει αυτό το πρόγραμμα:

  1. Αποθήκευση προϊόντων και τιμών: Φτιάχνουμε ένα Dictionary<string, double> για να αποθηκεύσουμε τα προϊόντα (π.χ. Μήλα, Πορτοκάλια) και τις τιμές τους (π.χ. 1.20 €).
  2. Προσθήκη προϊόντων: Χρησιμοποιούμε τη μέθοδο Add() για να προσθέσουμε προϊόντα και τιμές στο Dictionary.
  3. Εμφάνιση τιμής προϊόντος: Αν θέλεις να δεις την τιμή ενός προϊόντος, απλά χρησιμοποιείς το όνομά του ως κλειδί, όπως productPrices["Μήλα"].
  4. Προσθήκη νέου προϊόντος: Μπορούμε να προσθέσουμε ένα νέο προϊόν απευθείας, όπως τα “Αυγά”, και να καθορίσουμε την τιμή τους.
  5. Αφαίρεση προϊόντος: Αν ένα προϊόν δεν είναι πλέον διαθέσιμο, μπορούμε να το αφαιρέσουμε με τη μέθοδο Remove(), όπως το “Γάλα” στο παράδειγμα.
  6. Έλεγχος αν το προϊόν υπάρχει: Πριν προσπαθήσεις να βρεις την τιμή ενός προϊόντος, μπορείς να χρησιμοποιήσεις τη μέθοδο ContainsKey() για να ελέγξεις αν υπάρχει το προϊόν στο Dictionary.
  7. Εμφάνιση όλων των προϊόντων: Μπορείς να εμφανίσεις όλα τα προϊόντα και τις τιμές τους χρησιμοποιώντας έναν βρόχο foreach.

Ιδέες για επέκταση του project:

Μπορείς να επεκτείνεις αυτό το project προσθέτοντας περισσότερες λειτουργίες, όπως:

  • Υπολογισμός συνολικού κόστους: Να φτιάξεις μια λίστα αγορών και να υπολογίζεις το συνολικό κόστος των προϊόντων που αγοράζει ο πελάτης.
  • Έκπτωση: Να προσθέσεις λειτουργία που υπολογίζει εκπτώσεις σε προϊόντα.
  • Ποσότητα προϊόντων: Να αποθηκεύεις και τις ποσότητες των προϊόντων που έχεις στο κατάστημα και να ενημερώνεις το απόθεμα κάθε φορά που κάποιος αγοράζει.

Αυτό το project είναι πολύ χρήσιμο για να καταλάβεις πώς λειτουργούν τα Dictionaries και πώς μπορείς να τα χρησιμοποιήσεις για να αποθηκεύσεις και να διαχειρίζεσαι δεδομένα γρήγορα και αποτελεσματικά.

Ας δούμε μερικά ακόμη παραδείγματα όπου τα Dictionaries μπορούν να χρησιμοποιηθούν σε projects ή καταστάσεις της καθημερινής ζωής.

Παράδειγμα 1: Μαθητές και Βαθμοί

Μπορείς να φτιάξεις ένα πρόγραμμα που αποθηκεύει τους μαθητές και τους βαθμούς τους. Το κλειδί θα είναι το όνομα του μαθητή και η τιμή θα είναι ο βαθμός του.

Παράδειγμα κώδικα:

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        // Δημιουργία ενός Dictionary για μαθητές και βαθμούς
        Dictionary<string, int> studentGrades = new Dictionary<string, int>();

        // Προσθήκη μαθητών και βαθμών
        studentGrades.Add("Αλέξανδρος", 85);
        studentGrades.Add("Ελένη", 92);
        studentGrades.Add("Κώστας", 78);

        // Εμφάνιση βαθμού μαθητή
        Console.WriteLine("Ο βαθμός της Ελένης είναι: " + studentGrades["Ελένη"]);

        // Προσθήκη ή ενημέρωση βαθμού μαθητή
        studentGrades["Μαρία"] = 88;
        Console.WriteLine("Ο βαθμός της Μαρίας είναι: " + studentGrades["Μαρία"]);

        // Εμφάνιση όλων των μαθητών και βαθμών
        Console.WriteLine("Λίστα μαθητών και βαθμών:");
        foreach (var student in studentGrades)
        {
            Console.WriteLine(student.Key + ": " + student.Value);
        }
    }
}

Παράδειγμα 2: Ημερολόγιο Γενεθλίων

Μπορείς να δημιουργήσεις ένα πρόγραμμα που αποθηκεύει τα ονόματα των φίλων σου μαζί με τις ημερομηνίες των γενεθλίων τους. Έτσι, θα μπορείς να βρίσκεις γρήγορα πότε έχει γενέθλια κάποιος φίλος.

Παράδειγμα κώδικα:

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        // Δημιουργία ενός Dictionary για γενέθλια
        Dictionary<string, DateTime> birthdayCalendar = new Dictionary<string, DateTime>();

        // Προσθήκη φίλων και γενεθλίων
        birthdayCalendar.Add("Γιάννης", new DateTime(1990, 5, 23));
        birthdayCalendar.Add("Μαρία", new DateTime(1995, 8, 14));
        birthdayCalendar.Add("Κώστας", new DateTime(1988, 10, 2));

        // Εμφάνιση γενεθλίων ενός φίλου
        Console.WriteLine("Τα γενέθλια του Γιάννη είναι: " + birthdayCalendar["Γιάννης"].ToString("dd/MM/yyyy"));

        // Προσθήκη νέου φίλου
        birthdayCalendar["Ελένη"] = new DateTime(1992, 11, 19);
        Console.WriteLine("Τα γενέθλια της Ελένης είναι: " + birthdayCalendar["Ελένη"].ToString("dd/MM/yyyy"));

        // Εμφάνιση όλων των φίλων και γενεθλίων
        Console.WriteLine("Λίστα φίλων και γενεθλίων:");
        foreach (var friend in birthdayCalendar)
        {
            Console.WriteLine(friend.Key + ": " + friend.Value.ToString("dd/MM/yyyy"));
        }
    }
}

Παράδειγμα 3: Βιβλιοθήκη και Δανεισμένα Βιβλία

Φαντάσου ότι φτιάχνεις ένα πρόγραμμα για μια μικρή βιβλιοθήκη, όπου το Dictionary αποθηκεύει τα ονόματα των μελών και τα βιβλία που έχουν δανειστεί. Το κλειδί είναι το όνομα του μέλους και η τιμή είναι το βιβλίο που έχει δανειστεί.

Παράδειγμα κώδικα:

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        // Δημιουργία ενός Dictionary για μέλη και βιβλία
        Dictionary<string, string> borrowedBooks = new Dictionary<string, string>();

        // Προσθήκη μελών και βιβλίων που δανείστηκαν
        borrowedBooks.Add("Αλέξανδρος", "Ο Χάρι Πότερ");
        borrowedBooks.Add("Μαρία", "Το Όνομα του Ρόδου");
        borrowedBooks.Add("Κώστας", "Ο Άρχοντας των Δαχτυλιδιών");

        // Εμφάνιση βιβλίου που δανείστηκε ένα μέλος
        Console.WriteLine("Ο Αλέξανδρος δανείστηκε το βιβλίο: " + borrowedBooks["Αλέξανδρος"]);

        // Προσθήκη νέου μέλους
        borrowedBooks["Ελένη"] = "Η Αλίκη στη Χώρα των Θαυμάτων";
        Console.WriteLine("Η Ελένη δανείστηκε το βιβλίο: " + borrowedBooks["Ελένη"]);

        // Εμφάνιση όλων των μελών και βιβλίων που δανείστηκαν
        Console.WriteLine("Λίστα μελών και βιβλίων:");
        foreach (var member in borrowedBooks)
        {
            Console.WriteLine(member.Key + ": " + member.Value);
        }
    }
}

Παράδειγμα 4: Λεξικό και Ερμηνείες Λέξεων

Μπορείς να φτιάξεις ένα πρόγραμμα που λειτουργεί σαν λεξικό. Το Dictionary αποθηκεύει τις λέξεις ως κλειδιά και τις ερμηνείες τους ως τιμές.

Παράδειγμα κώδικα:

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        // Δημιουργία ενός Dictionary για λέξεις και ερμηνείες
        Dictionary<string, string> dictionary = new Dictionary<string, string>();

        // Προσθήκη λέξεων και ερμηνειών
        dictionary.Add("Αγάπη", "Έντονη στοργή και φροντίδα για κάποιον");
        dictionary.Add("Ελευθερία", "Η δυνατότητα να ενεργεί κανείς χωρίς περιορισμούς");
        dictionary.Add("Δικαιοσύνη", "Δίκαιη και αμερόληπτη διαχείριση των υποθέσεων");

        // Εμφάνιση ερμηνείας μιας λέξης
        Console.WriteLine("Η ερμηνεία της λέξης 'Αγάπη' είναι: " + dictionary["Αγάπη"]);

        // Προσθήκη νέας λέξης
        dictionary["Ελπίδα"] = "Προσδοκία για κάτι καλό στο μέλλον";
        Console.WriteLine("Η ερμηνεία της λέξης 'Ελπίδα' είναι: " + dictionary["Ελπίδα"]);

        // Εμφάνιση όλων των λέξεων και ερμηνειών
        Console.WriteLine("Λίστα λέξεων και ερμηνειών:");
        foreach (var word in dictionary)
        {
            Console.WriteLine(word.Key + ": " + word.Value);
        }
    }
}

Παράδειγμα 5: Κατηγοριοποίηση Ταινιών

Μπορείς να φτιάξεις ένα πρόγραμμα που αποθηκεύει ταινίες ανά είδος. Το κλειδί θα είναι το είδος της ταινίας (π.χ. Κωμωδία, Δράμα) και η τιμή θα είναι μια λίστα από ταινίες που ανήκουν σε αυτό το είδος.

Παράδειγμα κώδικα

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        // Δημιουργία ενός Dictionary για κατηγορίες ταινιών και λίστες ταινιών
        Dictionary<string, List<string>> movieCategories = new Dictionary<string, List<string>>();

        // Προσθήκη ταινιών ανά κατηγορία
        movieCategories.Add("Κωμωδία", new List<string> { "Η Μεγάλη των Μπάτσων Σχολή", "Γάμος αλά Ελληνικά" });
        movieCategories.Add("Δράμα", new List<string> { "Η Ζωή είναι Ωραία", "Οι Άθλιοι" });
        movieCategories.Add("Δράση", new List<string> { "Ο Σκοτεινός Ιππότης", "Επικίνδυνες Αποστολές" });

        // Εμφάνιση όλων των ταινιών ενός είδους
        Console.WriteLine("Ταινίες στο είδος Δράμα:");
        foreach (var movie in movieCategories["Δράμα"])
        {
            Console.WriteLine(movie);
        }

        // Προσθήκη νέας ταινίας σε είδος
        movieCategories["Δράση"].Add("Πολεμιστές του Φωτός");

        // Εμφάνιση όλων των κατηγοριών και ταινιών
        Console.WriteLine("Λίστα ταινιών ανά είδος:");
        foreach (var category in movieCategories)
        {
            Console.WriteLine(category.Key + ":");
            foreach (var movie in category.Value)
            {
                Console.WriteLine("  - " + movie);
            }
        }
    }
}