De obicei, folosim Distinct în C# pentru deduplicarea array-urilor, tipuri generale de date bazate pe tablou-uri, cum ar fi int, string. pot fi folosite și pentru deduplicarea obiectelor, să aruncăm o privire asupra definiției metodei Distinct din C#:
Există o sarcină mare, primul parametru este adăugat, adică metoda de expansiune, despre metoda de expansiune, vă rog să înțelegeți Baidu. Să studiem deduplicarea obiectelor din Distinct, să presupunem că avem acum o clasă Oameni:
Declarăm o colecție de obiecte ListPeole:
Să folosim metoda Distinct pe ListPeople fără niciun parametru, iar rezultatul este următorul:
Se poate observa că dacă metoda Distinct nu are parametri, va deduplica p, p1, p2 în setul de obiecte și nu există deduplicare pentru obiecte diferite cu aceeași valoare de membru a obiectului. Acum avem o cerință: pentru Persoanele cu același ID, să considerăm aceeași persoană, să producem persoanele neduplicate din set (doar una pentru același ID), în acest moment folosim a doua metodă Distinct, metoda care cere ca parametrii transmisi să fie de tip IEqualityComparer, moștenind o interfață generică, adăugăm următorul cod:
Moștenind interfața IEqualityComparer, trebuie să implementezi metodele Equals și GetHashCode. Când comparăm, putem introduce o entitate cu un PeopleCompareByID:
Rezultatele alergării sunt următoarele:
Am obținut efectul de deduplicare prin ID. Acum cerințele s-au schimbat din nou, ID-ul și provincia sunt aceeași persoană, pentru a genera informațiile persoanei (aceeași poate genera una după bunul plac), în acest moment vedem că ID=0 și Province="Hubei" sunt duplicate, pentru a le deduplica avem o altă clasă, sau moștenim de la IEqualityComparer:
În mod similar, când se folosește metoda Distinct, se trece o instanță a PeopleCompareByIDAndProvince:
Rezultatele după alergare sunt următoarele:
Am obținut efectul dorit. Această metodă poate fi folosită atunci când se întâlnește problema deduplicării cu trei sau mai mulți membri ai obiectului pentru a determina dacă obiectul este duplicat. Cele de mai sus sunt doar părerea mea.
|