Προγραμματισμός

Πώς να χρησιμοποιήσετε το HashSet στο C #

Το HashSet είναι μια βελτιστοποιημένη συλλογή μη ταξινομημένων, μοναδικών στοιχείων που παρέχει γρήγορες αναζητήσεις και λειτουργίες σετ υψηλής απόδοσης. Η κλάση HashSet παρουσιάστηκε για πρώτη φορά στο .NET 3.5 και αποτελεί μέρος του χώρου ονομάτων System.Collection.Generic. Αυτό το άρθρο μιλά για το πώς μπορούμε να εργαστούμε με τα HashSets στο C #.

Για να εργαστείτε με τα παραδείγματα κώδικα που παρέχονται σε αυτό το άρθρο, θα πρέπει να έχετε εγκαταστήσει το Visual Studio 2019 στο σύστημά σας. Εάν δεν έχετε ήδη αντίγραφο, μπορείτε να κατεβάσετε το Visual Studio 2019 εδώ.

Δημιουργήστε ένα έργο εφαρμογής .NET Core κονσόλας στο Visual Studio

Πρώτα απ 'όλα, ας δημιουργήσουμε ένα έργο εφαρμογής .NET Core Console στο Visual Studio. Ας υποθέσουμε ότι το Visual Studio 2019 είναι εγκατεστημένο στο σύστημά σας, ακολουθήστε τα βήματα που περιγράφονται παρακάτω για να δημιουργήσετε ένα νέο έργο εφαρμογής .NET Core Console στο Visual Studio.

  1. Εκκινήστε το Visual Studio IDE.
  2. Κάντε κλικ στο "Δημιουργία νέου έργου".
  3. Στο παράθυρο "Δημιουργία νέου έργου", επιλέξτε "Εφαρμογή κονσόλας (.NET Core)" από τη λίστα των προτύπων που εμφανίζονται.
  4. Κάντε κλικ στο Επόμενο.
  5. Στο παράθυρο "Διαμόρφωση του νέου έργου" που εμφανίζεται στη συνέχεια, καθορίστε το όνομα και την τοποθεσία για το νέο έργο.
  6. Κάντε κλικ στο Δημιουργία.

Αυτό θα δημιουργήσει ένα νέο έργο εφαρμογής .NET Core κονσόλας στο Visual Studio 2019. Θα χρησιμοποιήσουμε αυτό το έργο για να συνεργαστούμε με το HashSet στις επόμενες ενότητες αυτού του άρθρου.

Τι είναι το HashSet;

Ένα HashSet - που αντιπροσωπεύεται από την κατηγορία HashSet που σχετίζεται με το System.Collections.Generic namespace - είναι μια υψηλής απόδοσης, χωρίς ταξινόμηση συλλογή μοναδικών στοιχείων. Ως εκ τούτου, ένα HashSet δεν έχει ταξινομηθεί και δεν περιέχει διπλά στοιχεία. Ένα HashSet επίσης δεν υποστηρίζει δείκτες - μπορείτε να χρησιμοποιήσετε μόνο αριθμητές. Ένα HashSet χρησιμοποιείται συνήθως για λειτουργίες υψηλής απόδοσης που περιλαμβάνουν ένα σύνολο μοναδικών δεδομένων.

Η κλάση HashSet εφαρμόζει διάφορες διεπαφές όπως φαίνεται παρακάτω:

δημόσια τάξη HashSet: System.Collections.Generic.ICollection,

System.Collections.Generic.INumerable,

System.Collections.Generic.IReadOnlyCollection,

System.Collections.Generic.ISet,

System.Runtime.Serialization.IDeserializationCallback,

System.Runtime.Serialization.ISerializable

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

Αναζήτηση αντικειμένου σε HashSet σε C #

Για να αναζητήσετε ένα στοιχείο σε ένα HashSet μπορείτε να χρησιμοποιήσετε τη μέθοδο Περιεχόμενα όπως φαίνεται στο απόσπασμα κώδικα που δίνεται παρακάτω:

static void Main (συμβολοσειρά [] args)

        {

HashSet hashSet = νέο HashSet ();

hashSet.Add ("A");

hashSet.Add ("B");

hashSet.Add ("C");

hashSet.Add ("D");

εάν (hashSet.Contains ("D"))

Console.WriteLine ("Το απαιτούμενο στοιχείο είναι διαθέσιμο.");

αλλού

Console.WriteLine ("Το απαιτούμενο στοιχείο δεν είναι διαθέσιμο.");

Κονσόλα.ReadKey ();

        }

Τα στοιχεία HashSet είναι πάντα μοναδικά

Εάν προσπαθήσετε να εισαγάγετε ένα διπλό στοιχείο σε ένα HashSet, απλώς θα αγνοηθεί, αλλά δεν θα δημιουργηθεί καμία εξαίρεση χρόνου εκτέλεσης. Το ακόλουθο απόσπασμα κώδικα το δείχνει αυτό.

static void Main (συμβολοσειρά [] args)

{

HashSet hashSet = νέο HashSet ();

hashSet.Add ("A");

hashSet.Add ("B");

hashSet.Add ("C");

hashSet.Add ("D");

hashSet.Add ("D");

Console.WriteLine ("Ο αριθμός των στοιχείων είναι: {0}", hashSet.Count);

Κονσόλα.ReadKey ();

}

Όταν εκτελείτε το πρόγραμμα, η έξοδος θα είναι όπως φαίνεται στο Σχήμα 1.

Τώρα εξετάστε το ακόλουθο απόσπασμα κώδικα που δείχνει πώς εξαλείφονται τα διπλά στοιχεία:

συμβολοσειρά [] πόλεις = νέα συμβολοσειρά [] {

"Δελχί",

"Καλκούτα",

"Νέα Υόρκη",

"Λονδίνο",

"Τόκιο",

"Βάσιγκτων",

"Τόκιο"

            };

HashSet hashSet = νέο HashSet (πόλεις);

foreach (πόλη var στο hashSet)

            {

Console.WriteLine (πόλη);

            }

Όταν εκτελείτε το παραπάνω πρόγραμμα, τα διπλά ονόματα πόλεων θα αφαιρεθούν.

Κατάργηση στοιχείων από ένα HashSet στο C #

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

public bool Κατάργηση (στοιχείο T);

Εάν το στοιχείο βρίσκεται στη συλλογή, η μέθοδος Κατάργηση αφαιρεί ένα στοιχείο από το HashSet και επιστρέφει αληθές στην επιτυχία, ψευδώς διαφορετικά.

Το απόσπασμα κώδικα που δίνεται παρακάτω δείχνει πώς μπορείτε να χρησιμοποιήσετε τη μέθοδο Κατάργηση για να καταργήσετε ένα στοιχείο από ένα HashSet.

item string = "D";

εάν (hashSet.Contains (στοιχείο))

{

hashSet.Remove (στοιχείο);

}

Για να αφαιρέσετε όλα τα στοιχεία από ένα HashSet μπορείτε να χρησιμοποιήσετε τη μέθοδο Εκκαθάριση.

Χρησιμοποιήστε μεθόδους λειτουργίας σετ HashSet στο C #

Το HashSet έχει μια σειρά από σημαντικές μεθόδους για καθορισμένες λειτουργίες όπως IntersectWith, UnionWith, IsProperSubsetOf, ExceptWith και SymmetricExceptWith.

IsProperSubsetOf

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

HashSet setA = νέο HashSet () {"A", "B", "C", "D"};

HashSet setB = νέο HashSet () {"A", "B", "C", "X"};

HashSet setC = νέο HashSet () {"A", "B", "C", "D", "E"};

εάν (setA.IsProperSubsetOf (setC))

Console.WriteLine ("Το setC περιέχει όλα τα στοιχεία του setA.");

εάν (! setA.IsProperSubsetOf (setB))

Console.WriteLine ("Το setB δεν περιέχει όλα τα στοιχεία του setA.");

Όταν εκτελείτε το παραπάνω πρόγραμμα, θα πρέπει να δείτε την ακόλουθη έξοδο στο παράθυρο της κονσόλας.

UnionWith

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

HashSet setA = νέο HashSet () {"A", "B", "C", "D", "E"};

HashSet setB = νέο HashSet () {"A", "B", "C", "X", "Y"};

setA.UnionWith (setB);

foreach (string string στο setA)

{

Κονσόλα.WriteLine (str);

}

Όταν εκτελείτε το παραπάνω κομμάτι κώδικα, τα στοιχεία του setB αντιγράφονται στο setA. Έτσι, το setA θα περιλαμβάνει τώρα τα "A", "B", "C", "D", "E", "X" και "Y".

Διασταύρωση με

Η μέθοδος IntersectWith χρησιμοποιείται για την αναπαράσταση της τομής δύο HashSets. Ακολουθεί ένα παράδειγμα για να το κατανοήσετε αυτό.

HashSet setA = νέο HashSet () {"A", "B", "C", "D", "E"};

HashSet setB = νέο HashSet () {"A", "X", "C", "Y"};

setA.IntersectWith (setB);

foreach (string string στο setA)

{

Κονσόλα.WriteLine (str);

}

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

Εκτός με

Η μέθοδος ExceptWith αντιπροσωπεύει μαθηματική αφαίρεση συνόλων και είναι μια λειτουργία O (n). Ας υποθέσουμε ότι έχετε δύο HashSets setA και setB και καθορίζετε την ακόλουθη δήλωση:

setA.ExceptWith (setB);

Αυτό θα επέστρεφε τα στοιχεία του setA που δεν υπάρχουν στο setB. Ας το καταλάβουμε με ένα άλλο παράδειγμα. Εξετάστε το απόσπασμα κώδικα που δίνεται παρακάτω.

HashSet setA = νέο HashSet () {"A", "B", "C", "D", "E"};

HashSet setB = νέο HashSet () {"A", "X", "C", "Y"};

setA.ExceptWith (setB);

foreach (string string στο setA)

{

Κονσόλα.WriteLine (str);

}

Όταν εκτελείτε το παραπάνω πρόγραμμα, τα στοιχεία "B", "D" και "E" θα εκτυπωθούν στο παράθυρο της κονσόλας, όπως φαίνεται στο σχήμα 5.

Συμμετρική Εξαίρεση με

Η μέθοδος SymmetricExceptWith χρησιμοποιείται για την τροποποίηση ενός HashSet ώστε να περιέχει μόνο τα μοναδικά στοιχεία δύο HashSets, δηλαδή τα στοιχεία που δεν είναι κοινά και στα δύο HashSets. Εξετάστε το ακόλουθο απόσπασμα κώδικα που το απεικονίζει αυτό.

HashSet setA = νέο HashSet () {"A", "B", "C", "D", "E"};

HashSet setB = νέο HashSet () {"A", "X", "C", "Y"};

setA.SymmetricExceptWith (setB);

foreach (string string στο setA)

{

Κονσόλα.WriteLine (str);

}

Όταν εκτελείτε τον παραπάνω κώδικα, μόνο τα μοναδικά στοιχεία του setA και του setB - δηλαδή, τα στοιχεία που υπάρχουν στο setA αλλά όχι στο setB, και τα στοιχεία που υπάρχουν στο setB αλλά όχι στο setA - θα εμφανίζονται στο παράθυρο της κονσόλας όπως φαίνεται στο σχήμα 6.

Ενώ η μέση πολυπλοκότητα για την πρόσβαση ενός στοιχείου σε έναν πίνακα είναι O (n), όπου το n αντιπροσωπεύει τον αριθμό των στοιχείων στον πίνακα, η πολυπλοκότητα είναι μόνο O (1) για την πρόσβαση ενός συγκεκριμένου στοιχείου σε ένα HashSet. Αυτό καθιστά το HashSet μια καλή επιλογή για γρήγορες αναζητήσεις και για την εκτέλεση καθορισμένων λειτουργιών. Μπορείτε να χρησιμοποιήσετε μια λίστα εάν θέλετε να αποθηκεύσετε μια συλλογή αντικειμένων με συγκεκριμένη σειρά και ίσως να συμπεριλάβετε και διπλότυπα.

Πώς να κάνετε περισσότερα στο C #:

  • Τρόπος χρήσης των ονομαστικών και προαιρετικών παραμέτρων στο C #
  • Τρόπος συγκριτικής αξιολόγησης κώδικα C # χρησιμοποιώντας BenchmarkDotNet
  • Πώς να χρησιμοποιήσετε άπλετες διεπαφές και αλυσίδες μεθόδων στο C #
  • Πώς να ενοποιήσετε τις στατικές μεθόδους δοκιμής στο C #
  • Πώς να αναπαράγετε αντικείμενα του Θεού στο C #
  • Πώς να χρησιμοποιήσετε το ValueTask σε C #
  • Πώς να χρησιμοποιήσετε το αμετάβλητο στο C
  • Πώς να χρησιμοποιήσετε const, μόνο για ανάγνωση και στατικό σε C #
  • Πώς να χρησιμοποιήσετε σχολιασμούς δεδομένων στο C #
  • Πώς να εργαστείτε με GUID στο C # 8
  • Πότε να χρησιμοποιήσετε μια αφηρημένη τάξη εναντίον διεπαφής στο C #
  • Πώς να εργαστείτε με το AutoMapper στο C #
  • Πώς να χρησιμοποιήσετε τις εκφράσεις λάμδα στο C #
  • Πώς να συνεργαστείτε με τους αντιπροσώπους Action, Func και Predicate στο C #
  • Πώς να συνεργαστείτε με εκπροσώπους στο C #
  • Πώς να εφαρμόσετε έναν απλό καταγραφέα στο C #
  • Πώς να εργαστείτε με χαρακτηριστικά στο C #
  • Πώς να εργαστείτε με το log4net στο C #
  • Πώς να εφαρμόσετε το μοτίβο σχεδίασης αποθετηρίου στο C #
  • Πώς να εργαστείτε με προβληματισμό στο C #
  • Πώς να εργαστείτε με το σύστημα παρακολούθησης αρχείων στο C #
  • Πώς να εκτελέσετε τεμπέλης αρχικοποίηση στο C #
  • Πώς να εργαστείτε με το MSMQ στο C #
  • Πώς να εργαστείτε με μεθόδους επέκτασης στο C #
  • Πώς να μας εκφράσεις λάμδα στο C #
  • Πότε να χρησιμοποιήσετε την ευμετάβλητη λέξη-κλειδί στο C #
  • Πώς να χρησιμοποιήσετε τη λέξη-κλειδί απόδοσης στο C #
  • Πώς να εφαρμόσετε τον πολυμορφισμό στο C #
  • Πώς να δημιουργήσετε τον δικό σας προγραμματιστή εργασιών στο C #
  • Πώς να εργαστείτε με το RabbitMQ στο C #
  • Πώς να εργαστείτε με μια πλειάδα στο C #
  • Εξερεύνηση εικονικών και αφηρημένων μεθόδων στο C #
  • Πώς να χρησιμοποιήσετε το Dapper ORM στο C #
  • Πώς να χρησιμοποιήσετε το μοτίβο σχεδιασμού flyweight στο C #