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

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

[Πηγή] Linq: Μην χρησιμοποιείτε ποτέ το Count() > 0 για να προσδιορίσετε ότι το σύνολο δεν είναι κενό

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 12/10/2017 1:25:01 μ.μ. | | | |
Πριν από το Linq, χρησιμοποιούσαμε συνήθως την ακόλουθη μέθοδο για να προσδιορίσουμε εάν μια συλλογή δεν είναι κενή, δηλαδή μια συλλογή περιέχει στοιχεία:


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

Αλλά στην εποχή του Linq, η μέθοδος επέκτασης Enumerable.Count "ενοποίησε" τις ιδιότητες Length και Count, με αποτέλεσμα τον ακόλουθο τρόπο γραφής για να κριθεί η μη ακυρότητα:


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

Σημειώστε ότι είναι δυνατό, όχι απαραίτητα, και εάν η παραπάνω μέθοδος περάσει ως Πίνακας<T>, Λίστα ή Συλλογή<T>, δεν θα υπάρχει πρόβλημα.



Πότε λοιπόν κάτι θα πάει στραβά; Ας δούμε τις ακόλουθες μεθόδους:


Όταν καλείται:



Η ταχύτητα εκτέλεσης θα είναι αρκετά αργή και χρειάστηκαν περίπου 70 δευτερόλεπτα για να εκτελέσει ο υπολογιστής μου την πηγή. Πλήθος() > 0。


Αν το αναλύσετε, θα διαπιστώσετε ότι η απόδοση απόδοσης i στη γραμμή 5 του κώδικα GetNums εκτελείται int. MaxValue, είναι απαραίτητο;

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

Πώς να κρίνουμε λοιπόν; Μπορούμε να χρησιμοποιήσουμε το Enumerable.Οποιαδήποτε μέθοδο επέκτασης:



Τροποποιήστε τη μέθοδο SomeAction ως εξής:



Καλέστε το ξανά και θα διαπιστώσετε ότι ο χρόνος εκτέλεσης είναι αμελητέος.


Συνοψίζοντας, η Count() > 0 θα έχει αναπόφευκτα προβλήματα απόδοσης όταν συναντήσει yeild return.






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

Mail To:help@itsvse.com