Εκμάθηση C# Collections με παραδείγματα

⚡ Έξυπνη Σύνοψη

Οι συλλογές σε C# παρέχουν έναν ευέλικτο τρόπο αποθήκευσης και διαχείρισης ομάδων αντικειμένων. Σε αντίθεση με τους πίνακες, οι συλλογές αναπτύσσονται και συρρικνώνονται κατά τον χρόνο εκτέλεσης, και οι χώροι ονομάτων System.Collections και System.Collections.Generic παρέχουν έτοιμους τύπους για λίστες, λεξικά, στοίβες και ουρές.

  • 🔃 Δυναμική διαστασιολόγηση: Οι συλλογές προσθέτουν και αφαιρούν στοιχεία κατά τον χρόνο εκτέλεσης, επομένως δεν καθορίζετε το μέγεθος εκ των προτέρων όπως ένας πίνακας.
  • 📚 Χώροι ονομάτων: Το System.Collections περιέχει τους μη γενικούς τύπους, ενώ το System.Collections.Generic περιέχει τους γενικούς τύπους που είναι ασφαλείς ως προς τους τύπους.
  • 🧱 Βασικά μαθήματα: Τα ArrayList, Stack, Queue, Hashtable, SortedList και BitArray καλύπτουν τις συνήθεις μη γενικές ανάγκες.
  • Γενική ισχύς: Οι List, Dictionary, HashSet και Queue προσθέτουν ασφάλεια τύπου κατά τη μεταγλώττιση και καλύτερη απόδοση.
  • 🔑 Σωστή επιλογή: Χρησιμοποιήστε ένα λεξικό για αναζητήσεις κλειδιών, μια λίστα για τα παραγγελθέντα είδη και μια στοίβα ή ουρά για παραγγελίες LIFO ή FIFO.
  • 🤖 Βοήθεια AI: Τα scaffolds του GitHub Copilot συλλέγουν κώδικα και οι αγωγοί ML.NET μεταδίδουν δεδομένα μέσω γενικών τύπων συλλογής.

Συλλογές σε C#

Στο προηγούμενο μάθημά μας, μάθαμε πώς μπορούμε να χρησιμοποιούμε πίνακες στο C#. Ας κάνουμε μια γρήγορη επισκόπηση, οι πίνακες στον προγραμματισμό χρησιμοποιούνται για την ομαδοποίηση ενός συνόλου σχετικών αντικειμένων. Έτσι, θα μπορούσε κανείς να δημιουργήσει έναν πίνακα ή ένα σύνολο ακεραίων, στους οποίους θα μπορούσε να προσπελαστεί μέσω ενός ονόματος μεταβλητής.

Τι είναι οι Συλλογές στο C#;

Οι συλλογές είναι παρόμοιες με Array, παρέχει έναν πιο ευέλικτο τρόπο εργασίας με μια ομάδα αντικειμένων.

Στους πίνακες, θα είχατε παρατηρήσει ότι πρέπει να ορίσετε τον αριθμό των στοιχείων σε έναν πίνακα εκ των προτέρων. Αυτό έπρεπε να γίνει όταν δηλώθηκε ο πίνακας.

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

System.Collections Classes

Το .NET Framework ομαδοποιεί τις αρχικές μη γενικές κλάσεις συλλογών μέσα στον χώρο ονομάτων System.Collections. Ο παρακάτω πίνακας συνοψίζει τους κύριους τύπους που μπορείτε να χρησιμοποιήσετε αμέσως.

Συλλογή Περιγραφή
Λίστα Array Η συλλογή ArrayList είναι παρόμοια με τους Arrays τύπος δεδομένων σε C#. Η μεγαλύτερη διαφορά είναι η δυναμική φύση της συλλογής λίστας πίνακα.
Στοίβα Η στοίβα είναι μια συλλογή ειδικών περιπτώσεων που αντιπροσωπεύει την έννοια του τελευταίου εισερχόμενου πρώτου εξερχόμενου (LIFO).
ουρές Η Ουρά είναι μια συλλογή ειδικών περιπτώσεων που αντιπροσωπεύει την ιδέα του "ό,τι μπαίνει πρώτο, πρώτο βγαίνει".
Hashtable Ένας πίνακας κατακερματισμού είναι μια ειδική συλλογή που χρησιμοποιείται για την αποθήκευση στοιχείων κλειδιού-τιμής.
Ταξινομημένη Λίστα Η SortedList είναι μια συλλογή που αποθηκεύει ζεύγη κλειδιών-τιμών με αύξουσα σειρά κλειδιού από προεπιλογή.
BitArray Ένας πίνακας bit είναι ένας πίνακας δομής δεδομένων που αποθηκεύει bits.

Γενικές συλλογές σε C#

Οι μη γενικές κλάσεις παραπάνω αποθηκεύουν κάθε στοιχείο ως γενικό αντικείμενο, πράγμα που σημαίνει ότι ο μεταγλωττιστής δεν μπορεί να ελέγξει τον τύπο και το πρόγραμμα πληρώνει ένα μικρό κόστος για τιμές σε κουτιά. Για να λύσει αυτό το πρόβλημα, η C# πρόσθεσε τον χώρο ονομάτων System.Collections.Generic, όπου κάθε συλλογή είναι συνδεδεμένη με έναν δηλωμένο τύπο.

Μια γενική συλλογή όπως η Λίστα Δέχεται μόνο συμβολοσειρές, επομένως τα λάθη εντοπίζονται κατά τη μεταγλώττιση και δεν απαιτείται μετατροπή όταν διαβάζετε ένα στοιχείο ξανά. Αυτό καθιστά τις γενικές συλλογές ασφαλέστερες, ταχύτερες και πιο εύκολες στην ανάγνωση, γι' αυτό και αποτελούν την προεπιλεγμένη επιλογή στον σύγχρονο κώδικα C#.

Οι πιο συνηθισμένες γενικές συλλογές παρατίθενται παρακάτω:

  • Λίστα : Μια λίστα με δυνατότητα αλλαγής μεγέθους, βασισμένη σε ευρετήριο, η γενική αντικατάσταση του ArrayList.
  • Λεξικό : Αποθηκεύει ζεύγη κλειδιού-τιμής με γρήγορες αναζητήσεις που βασίζονται σε κατακερματισμό.
  • HashSet : Διατηρεί μόνο μοναδικές τιμές και υποστηρίζει λειτουργίες συνόλου όπως η ένωση.
  • Ουρά : Μια συλλογή με την πρώτη είσοδο και την πρώτη έξοδο, η γενική έκδοση του Queue.
  • Σωρός : Μια συλλογή που εισέρχεται πρώτος βγαίνει, η γενική έκδοση του Stack.
  • ΤαξινομημένηΛίστα : Διατηρεί τα ζεύγη κλειδιού-τιμής ταξινομημένα κατά κλειδί σε αύξουσα σειρά.

Παράδειγμα Συλλογής Λιστών σε C#

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

Βήμα 1) Εισαγάγετε τον χώρο ονομάτων System.Collections.Generic και δηλώστε μια λίστα συμβολοσειρών.

Βήμα 2) Προσθέστε στοιχεία με τη μέθοδο Προσθήκη και διαγράψτε ένα με τη μέθοδο Αφαίρεση.

Βήμα 3) Διαβάστε την ιδιότητα Count και, στη συνέχεια, κάντε επανάληψη στη λίστα με μια εντολή foreach.

using System;
using System.Collections.Generic;
namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   List<string> tutorials = new List<string>();
   tutorials.Add("Java");
   tutorials.Add("Python");
   tutorials.Add("Kotlin");
   tutorials.Remove("Python");
   Console.WriteLine(tutorials.Count);
   foreach (string tutorial in tutorials)
   {
    Console.WriteLine(tutorial);
   }
   Console.ReadKey();
  }
 }
}

Code Εξήγηση:-

  1. Ο χώρος ονομάτων System.Collections.Generic εισάγεται, ώστε ο τύπος Λίστας να είναι διαθέσιμος στο πρόγραμμα.
  2. Μια νέα λίστα Δημιουργείται ένα αρχείο με την ονομασία tutorials και προστίθενται τρία ονόματα με τη μέθοδο Add.
  3. Η μέθοδος Remove διαγράφει την τιμή "Python», το οποίο αφήνει δύο στοιχεία στη λίστα.
  4. Η ιδιότητα Count επιστρέφει τον αριθμό των στοιχείων και ο βρόχος foreach εκτυπώνει κάθε υπόλοιπη τιμή με τη σειρά.

Όταν εκτελείται το πρόγραμμα, αρχικά εκτυπώνει τον αριθμό των 2, Ακολουθούμενη από Java και Κοτλίν σε ξεχωριστές γραμμές. Αυτό δείχνει πώς μια συλλογή αλλάζει το μέγεθός της κατά τον χρόνο εκτέλεσης, κάτι που ένας σταθερός πίνακας δεν μπορεί να κάνει.

Διαφορά μεταξύ πινάκων και συλλογών σε C#

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

Οι κύριες διαφορές παρατίθενται παρακάτω:

  • Διαστάσεις: Ένας πίνακας έχει ένα σταθερό μήκος που ορίζεται κατά τη δήλωση, ενώ μια συλλογή μπορεί να αυξηθεί ή να συρρικνωθεί ανά πάσα στιγμή.
  • Χειρισμός τύπων: Ένας πίνακας αποθηκεύει έναν μόνο τύπο, ενώ μια συλλογή μπορεί να είναι ασφαλής ως προς τους τύπους με γενικούς τύπους ή να περιέχει αντικείμενα μικτών τύπων όταν δεν είναι γενικοί.
  • Περιοχή: Οι πίνακες είναι ενσωματωμένοι στη γλώσσα, ενώ οι κλάσεις συλλογών βρίσκονται στους χώρους ονομάτων System.Collections και System.Collections.Generic.
  • Ενσωματωμένες λειτουργίες: Οι συλλογές προσφέρουν έτοιμες μεθόδους για την προσθήκη, την αφαίρεση, την αναζήτηση και την ταξινόμηση στοιχείων, ενώ οι πίνακες παρέχουν μόνο βασική πρόσβαση με ευρετήριο.
  • καλύτερη χρήση: Επιλέξτε έναν πίνακα όταν ο αριθμός των στοιχείων είναι γνωστός και σταθερός, και μια συλλογή όταν ο αριθμός αλλάζει καθώς εκτελείται το πρόγραμμα.

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

Συχνές Ερωτήσεις

Χρησιμοποιήστε ένα λεξικό όταν χρειάζεστε γρήγορες αναζητήσεις με ένα μοναδικό κλειδί, όπως ένα αναγνωριστικό που έχει αντιστοιχιστεί σε μια εγγραφή. Βρίσκει τιμές σε σχεδόν σταθερό χρόνο, ενώ μια λίστα πρέπει να σαρώνει τα στοιχεία ένα προς ένα.

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

Οι ταυτόχρονες συλλογές βρίσκονται στον χώρο ονομάτων System.Collections.Concurrent και έχουν δημιουργηθεί για πολυνηματικό κώδικα. Τύποι όπως το ConcurrentDictionary και το BlockingCollection επιτρέπουν σε πολλά νήματα να προσθέτουν και να αφαιρούν στοιχεία με ασφάλεια χωρίς χειροκίνητα κλειδώματα.

Το IEnumerable είναι η βασική διεπαφή που υποστηρίζει μόνο την ανάγνωση στοιχείων με βρόχο foreach. Το iCollection το επεκτείνει και προσθέτει μέλη όπως Count, Add και Remove, επομένως υποστηρίζει επίσης την τροποποίηση της συλλογής.

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

Μια Στοίβα λειτουργεί με τη σειρά που έρχεται πρώτο και έξω, επομένως το πιο πρόσφατο αντικείμενο αφαιρείται πρώτο χρησιμοποιώντας το Pop. Μια Ουρά λειτουργεί με τη σειρά που έρχεται πρώτο και έξω, επομένως το παλαιότερο αντικείμενο αφαιρείται πρώτο χρησιμοποιώντας το Dequeue.

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

Το ML.NET τροφοδοτεί δεδομένα εκπαίδευσης μέσω συλλογών όπως οι List και IEnumerable, οι οποίες αντιστοιχίζονται στον αγωγό IDataView. Η αποθήκευση δειγμάτων σε μια γενική συλλογή με ισχυρούς τύπους διατηρεί τη ροή εργασίας μηχανικής μάθησης σαφή και ασφαλή ως προς τους τύπους.

Συνοψίστε αυτήν την ανάρτηση με: