Αυτό το άρθρο είναι ένα άρθρο καθρέφτη της αυτόματης μετάφρασης, κάντε κλικ εδώ για να μεταβείτε στο αρχικό άρθρο.

Άποψη: 22157|Απάντηση: 1

[Πηγή] C# Generic Range Rover (Στροφή)

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 11/11/2014 8:56:04 π.μ. | | |
Οι συλλογές είναι μια σημαντική έννοια στο OOP και η πλήρης υποστήριξη για συλλογές σε C# είναι μία από τις καλύτερες της γλώσσας.
    Γιατί να χρησιμοποιήσετε γενικά σύνολα;
    Πριν από το C# 2.0, οι συλλογές μπορούσαν να υλοποιηθούν με δύο βασικούς τρόπους:
    α. Χρησιμοποιήστε το ArrayList
    Η τοποθέτηση αντικειμένων απευθείας στο ArrayList είναι διαισθητική, αλλά επειδή τα στοιχεία της συλλογής είναι τύπου Object, πρέπει να κάνετε κουραστική μετατροπή τύπου κάθε φορά που το χρησιμοποιείτε.
    β. Χρησιμοποιήστε προσαρμοσμένες συλλογής
    Μια κοινή πρακτική είναι να κληρονομήσετε μια προσαρμοσμένη κλάση από την αφηρημένη κλάση CollectionBase και να εφαρμόσετε μια ισχυρή συλλογή τύπων ενθυλακώνοντας το αντικείμενο IList. Αυτή η μέθοδος απαιτεί τη σύνταξη μιας αντίστοιχης προσαρμοσμένης κλάσης για κάθε τύπο συλλογής, κάτι που είναι πολλή δουλειά. Η εμφάνιση γενικών συλλογών λύνει καλά τα παραπάνω προβλήματα και μόνο μία γραμμή κώδικα μπορεί να χρησιμοποιηθεί για τη δημιουργία ενός συνόλου συγκεκριμένου τύπου.
    Τι είναι το γενόσημο;
    Τα γενόσημα είναι νέα στοιχεία στη C# 2.0 (που ονομάζονται πρότυπα στη C++) που χρησιμοποιούνται κυρίως για την επίλυση μιας σειράς παρόμοιων προβλημάτων. Αυτός ο μηχανισμός επιτρέπει στο όνομα της κλάσης να περάσει ως όρισμα στον γενικό τύπο και δημιουργείται το αντίστοιχο αντικείμενο. Ίσως είναι καλύτερο να σκεφτούμε τα γενικά (συμπεριλαμβανομένων των κλάσεων, των διεπαφών, των μεθόδων, των αντιπροσώπων κ.λπ.) ως πρότυπα, όπου το τμήμα της παραλλαγής αντικαθίσταται από το όνομα της κλάσης που μεταβιβάζεται ως όρισμα, με αποτέλεσμα έναν νέο ορισμό τύπου. Το γενικό είναι ένα σχετικά μεγάλο θέμα και δεν θα το αναλύσω λεπτομερώς εδώ και όσοι ενδιαφέρονται μπορούν να συμβουλευτούν τις σχετικές πληροφορίες.
    Πώς μπορώ να δημιουργήσω μια γενική συλλογή;
    Η γενική κλάση List κάτω από τον χώρο ονομάτων System.Collections.Generic <T>χρησιμοποιείται για τη δημιουργία συλλογών και η σύνταξη είναι η εξής:
[mw_shl_code=csharp,αληθές] Λίστα<T> ListOfT = νέα λίστα<T>(); [/mw_shl_code]
Το "T" είναι ο τύπος που θα χρησιμοποιηθεί, ο οποίος μπορεί να είναι απλοί τύποι, όπως string, int ή τύποι που ορίζονται από το χρήστη. Ας δούμε ένα συγκεκριμένο παράδειγμα.

Η κατηγορία Person ορίζεται ως εξής:
[mw_shl_code=csharp,true]τάξη Πρόσωπο
{
    ιδιωτική _name χορδών? Όνομα
    ιδιωτικό διεθνές _age; Hλικία

    Δημιουργία αντικειμένου "Πρόσωπο"
    public Person(συμβολοσειρά Όνομα, int Age)
    {
        this._name= Όνομα;
        this._age = Ηλικία;
    }

    Όνομα
    Όνομα δημόσιας συμβολοσειράς
    {
        get { return _name; }
    }

    Hλικία
    public int Ηλικία
    {
        λάβετε { επιστροφή _age; }
    }
}

//创建Person对象
Άτομο p1 = νέο Πρόσωπο ("Zhang San", 30);
Πρόσωπο p2 = νέο Πρόσωπο ("Li Si", 20);
Πρόσωπο p3 = νέο Πρόσωπο ("Wang Wu", 50);

//创建类型为Person的对象集合
Λίστα<Person> προσώπων = νέα Λίστα<Person>();

//将Person对象放入集合
προσώπων. Προσθήκη(p1);
προσώπων. Προσθήκη(p2);
προσώπων. Προσθήκη(p3);

//输出第2个人的姓名
Console.Write(άτομα[1]. Όνομα); [/mw_shl_code]
Όπως μπορείτε να δείτε, οι γενικές συλλογές απλοποιούν σημαντικά τον κώδικα υλοποίησης των συλλογών, μέσω του οποίου μπορείτε εύκολα να δημιουργήσετε συλλογές καθορισμένων τύπων. Όχι μόνο αυτό, αλλά οι γενικές συλλογές παρέχουν επίσης πιο ισχυρές λειτουργίες, ας ρίξουμε μια ματιά στην ταξινόμηση και την αναζήτηση σε αυτές.
    Ταξινόμηση γενικών συλλογών
    Η ταξινόμηση βασίζεται στη σύγκριση και για να ταξινομήσετε, πρέπει πρώτα να συγκρίνετε. Για παράδειγμα, εάν υπάρχουν δύο αριθμοί 1 και 2, για να τους ταξινομήσουμε, πρέπει πρώτα να συγκρίνουμε αυτούς τους δύο αριθμούς και να τους ταξινομήσουμε σύμφωνα με τα αποτελέσματα σύγκρισης. Εάν θέλετε να συγκρίνετε αντικείμενα, η κατάσταση είναι λίγο πιο περίπλοκη, για παράδειγμα, εάν συγκρίνετε αντικείμενα προσώπου, μπορείτε να συγκρίνετε με βάση το όνομα ή την ηλικία, κάτι που απαιτεί τον καθορισμό των κανόνων σύγκρισης. Ένα αντικείμενο μπορεί να έχει πολλούς κανόνες σύγκρισης, αλλά μόνο έναν προεπιλεγμένο κανόνα, ο οποίος τοποθετείται στην κλάση που ορίζει το αντικείμενο. Οι προεπιλεγμένοι κανόνες σύγκρισης ορίζονται στη μέθοδο CompareTo, η οποία ανήκει στη γενική διεπαφή IComparable<T>. Δείτε τον παρακάτω κώδικα:
[mw_shl_code=csharp,true]κλάση Πρόσωπο :IComparable<Person>
{
    Σύγκριση ανά ηλικία
    public int CompareTo(Άτομο p)
    {
        Επιστρέψτε αυτό. Ηλικία - σελ.Ηλικία;
    }
}[/mw_shl_code]
Οι παράμετροι της μεθόδου CompareTo είναι ένα άλλο αντικείμενο του ίδιου τύπου που πρέπει να συγκριθεί, η τιμή επιστροφής είναι int type, εάν η τιμή επιστροφής είναι μεγαλύτερη από 0, σημαίνει ότι το πρώτο αντικείμενο είναι μεγαλύτερο από το δεύτερο αντικείμενο, εάν η τιμή επιστροφής είναι μικρότερη από 0, σημαίνει ότι το πρώτο αντικείμενο είναι μικρότερο από το δεύτερο αντικείμενο και εάν επιστρέψει 0, τα δύο αντικείμενα είναι ίσα.
Αφού ορίσετε τους προεπιλεγμένους κανόνες σύγκρισης, μπορείτε να ταξινομήσετε τη συλλογή χρησιμοποιώντας τη μέθοδο Ταξινόμηση χωρίς παραμέτρους, ως εξής:
[mw_shl_code=csharp,true]// Ταξινόμηση της συλλογής σύμφωνα με τους προεπιλεγμένους κανόνες
προσώπων. Sort();

//输出所有人姓名
foreach (Πρόσωπο p σε πρόσωπα)
{
    Console.WriteLine(p.Name); Η σειρά εξόδου είναι "Li Si", "Zhang San" και "Wang Wu"
}[/mw_shl_code]
Στην πράξη, είναι συχνά απαραίτητο να ταξινομηθεί η συλλογή σύμφωνα με μια ποικιλία διαφορετικών κανόνων, κάτι που απαιτεί τον ορισμό άλλων κανόνων σύγκρισης, οι οποίοι μπορούν να οριστούν στη μέθοδο σύγκρισης, η οποία ανήκει στη γενική διεπαφή IComparer<T>, δείτε τον ακόλουθο κώδικα:
[mw_shl_code=csharp,true]κλάση NameComparer : IComparer<Person>
{
    Παρουσίες sequencer αποθήκευσης
    δημόσιο στατικό NameComparer Default = νέο NameComparer();

    Σύγκριση με το όνομα
    public int Compare(Άτομο p1, Άτομο p2)
    {
        return System.Collections.Comparer.Default.Compare(p1. Όνομα, σ. 2. Όνομα);
    }
}[/mw_shl_code]
Οι παράμετροι της μεθόδου σύγκρισης είναι δύο αντικείμενα του ίδιου τύπου προς σύγκριση και η τιμή επιστροφής είναι τύπου int και οι κανόνες επεξεργασίας της τιμής επιστροφής είναι οι ίδιοι με αυτούς της μεθόδου σύγκρισης. Το Comparer.Default επιστρέφει ένα ενσωματωμένο αντικείμενο Comparer για τη σύγκριση δύο αντικειμένων του ίδιου τύπου.
    Δείτε πώς μπορείτε να ταξινομήσετε τη συλλογή με αυτόν τον πρόσφατα καθορισμένο συγκριτή:
[mw_shl_code=csharp,true]//Ταξινόμηση της συλλογής με βάση το όνομα
προσώπων. Sort(NameComparer.Default);

//输出所有人姓名
foreach (Πρόσωπο p σε πρόσωπα)
{
    Console.WriteLine(p.Name); Η σειρά εξόδου είναι "Li Si", "Wang Wu" και "Zhang San"
}[/mw_shl_code]
Μπορείτε επίσης να ταξινομήσετε τη συλλογή αναθέτοντας, πρώτα απ 'όλα, να ορίσετε μια μέθοδο για να καλέσει ο πληρεξούσιος για να αποθηκεύσει τους κανόνες σύγκρισης και μπορείτε να χρησιμοποιήσετε μια στατική μέθοδο. Δείτε τον παρακάτω κώδικα:
[mw_shl_code=csharp,true]κλάση PersonComparison
{
    Σύγκριση με το όνομα
    public static int Όνομα(Άτομο p1, Άτομο p2)
    {
        return System.Collections.Comparer.Default.Compare(p1. Όνομα, σ. 2. Όνομα);
    }
}[/mw_shl_code]
Οι παράμετροι της μεθόδου είναι δύο αντικείμενα του ίδιου τύπου προς σύγκριση, η τιμή επιστροφής είναι τύπου int και ο κανόνας επεξεργασίας επιστρεφόμενης τιμής είναι ο ίδιος με αυτόν της μεθόδου CompareTo.Στη συνέχεια, ταξινομήστε τη συλλογή μέσω του ενσωματωμένου γενικού αντιπροσώπου System.Σύγκριση<T>:
[mw_shl_code=csharp,αληθές] System.Comparison<Person> NameComparison = νέο System.Comparison<Person>(PersonComparison.Name);
προσώπων. Sort(ΣύγκρισηΟνομάτων);

//输出所有人姓名
foreach (Πρόσωπο p σε πρόσωπα)
{
    Console.WriteLine(p.Name); Η σειρά εξόδου είναι "Li Si", "Wang Wu" και "Zhang San"
}[/mw_shl_code]
Μπορεί να φανεί ότι οι δύο τελευταίες μέθοδοι μπορούν να ταξινομήσουν τη συλλογή σύμφωνα με τους καθορισμένους κανόνες, αλλά ο συγγραφέας προτιμά να χρησιμοποιήσει τη μέθοδο ανάθεσης και μπορεί να εξετάσει το ενδεχόμενο να βάλει διάφορους κανόνες σύγκρισης σε μια κλάση και στη συνέχεια να τους καλέσει με ευελιξία.
    Αναζήτηση για γενικές συλλογές
    Η αναζήτηση είναι η εύρεση στοιχείων που πληρούν συγκεκριμένες συνθήκες από τη συλλογή και μπορούν να οριστούν και να κληθούν πολλαπλές συνθήκες αναζήτησης ανάλογα με τις ανάγκες. Αρχικά, ορίστε τα κριτήρια αναζήτησης ως εξής:
[mw_shl_code=csharp,true]κλάση PersonPredicate
{
    Βρείτε μεσήλικες (άνω των 40)
    δημόσιο στατικό bool MidAge(Άτομο p)
    {
        αν (p.Ηλικία >= 40)
            επιστροφή αληθής?
        αλλιώς
            επιστροφή ψευδής?
    }
}[/mw_shl_code]
Τα παραπάνω κριτήρια αναζήτησης τοποθετούνται σε μια στατική μέθοδο με δυαδικό τύπο επιστροφής και τα στοιχεία της συλλογής που πληρούν ορισμένες προϋποθέσεις επιστρέφουν true, διαφορετικά false.Στη συνέχεια, αναζητήστε τη συλλογή μέσω του ενσωματωμένου γενικού αντιπροσώπου System.Predicate<T>:
[mw_shl_code=csharp,αληθές] System.Predicate<Person> MidAgePredicate = νέο System.Predicate<Person>(PersonPredicate.MidAge);
Λίστα<Person> MidAgePersons = άτομα. FindAll(Κατηγόρημα μέσης ηλικίας);

//输出所有的中年人姓名
foreach (Άτομο p στο MidAgePersons)
{
    Console.WriteLine(p.Name); Έξοδος "Wang Wu"
}[/mw_shl_code]
Επέκταση των γενικών συλλογών
    Τι γίνεται αν θέλετε να λάβετε τα ονόματα όλων των ατόμων στο σετ, χωρισμένα με κόμμα;
    Λαμβάνοντας υπόψη ότι η λειτουργικότητα που μπορεί να παρέχει μια μεμονωμένη κλάση είναι περιορισμένη, είναι φυσικό να σκεφτούμε <T>την επέκταση της κλάσης List, η οποία είναι επίσης μια κλάση και επομένως μπορεί να επεκταθεί με κληρονομικότητα. Δείτε τον παρακάτω κώδικα:
[mw_shl_code=csharp,true]// Ορίστε την κλάση συλλογής Persons
τάξη Πρόσωπα : Λίστα<Person>
{
    Λήψη των ονομάτων όλων των μελών της συλλογής
    δημόσια συμβολοσειρά GetAllNames()
    {
        Αν (αυτό. Πλήθος == 0)
            επιστροφή "";

        συμβολοσειρά val = "";
        foreach (Άτομο p σε αυτό)
        {
            val += p.Name + ",";
        }

        επιστροφή val. Υποσυμβολοσειρά(0, val. Μήκος - 1);
    }
}

//创建并填充Persons集合
Πρόσωπα PersonCol = νέα Πρόσωπα();
PersonCol.Add(p1);
PersonCol.Add(p2);
PersonCol.Add(p3);

//输出所有人姓名
Console.Write(PersonCol.GetAllNames()); Έξοδος "Zhang San, Li Si, Wang Wu"[/mw_shl_code]
Περίληψη:
    Αυτό το άρθρο εστιάζει στη χρήση γενόσημων στη C# 2.0 για την υλοποίηση συλλογών, καθώς και για την επέκταση της λειτουργίας συλλογής, και η σωστή χρήση των γενικών συλλογών μπορεί να μειώσει πολλές επικαλύψεις εργασιών και να βελτιώσει σημαντικά την αποτελεσματικότητα της ανάπτυξης. Στην πραγματικότητα, τα σετ είναι απλώς μια τυπική εφαρμογή των γενόσημων και αν θέλετε να μάθετε περισσότερα για τα γενόσημα, μπορείτε να συμβουλευτείτε άλλα σχετικά υλικά. Ελπίζω αυτό το άρθρο να σας ήταν χρήσιμο :-)





Προηγούμενος:Υπάρχουν διάφοροι τύποι συνάθροισης για συλλογές σε C#
Επόμενος:Ανάρτηση SOS, ελπίζω ο Θεός να με βοηθήσει, ξέχασα τον κωδικό πρόσβασης του συστήματος σύνδεσης μαθητή σχολείου, πώς να πάρω πίσω τον κωδικό πρόσβασης για βοήθεια; Ευχαριστώ εκ των προτέρων
Δημοσιεύτηκε στις 24/11/2014 11:48:29 π.μ. |
Εξαλείψτε τις μηδενικές ανακτήσεις
Αποκήρυξη:
Όλο το λογισμικό, το υλικό προγραμματισμού ή τα άρθρα που δημοσιεύονται από το Code Farmer Network προορίζονται μόνο για μαθησιακούς και ερευνητικούς σκοπούς. Το παραπάνω περιεχόμενο δεν θα χρησιμοποιηθεί για εμπορικούς ή παράνομους σκοπούς, άλλως οι χρήστες θα υποστούν όλες τις συνέπειες. Οι πληροφορίες σε αυτόν τον ιστότοπο προέρχονται από το Διαδίκτυο και οι διαφορές πνευματικών δικαιωμάτων δεν έχουν καμία σχέση με αυτόν τον ιστότοπο. Πρέπει να διαγράψετε εντελώς το παραπάνω περιεχόμενο από τον υπολογιστή σας εντός 24 ωρών από τη λήψη. Εάν σας αρέσει το πρόγραμμα, υποστηρίξτε γνήσιο λογισμικό, αγοράστε εγγραφή και λάβετε καλύτερες γνήσιες υπηρεσίες. Εάν υπάρχει οποιαδήποτε παραβίαση, επικοινωνήστε μαζί μας μέσω email.

Mail To:help@itsvse.com