Obvykle používáme Distinct v C# pro deduplikaci polí, obecné datové typy založené na polích, jako je int, string. lze také použít pro deduplikaci objektů, podívejme se na definici metody Distinct v C#:
Je zde velké zatížení, přidává se první parametr, což je metoda rozšiřování, o metodě rozšiřování, prosím, Baidu pochop. Pojďme studovat deduplikaci objektů v Distinct, řekněme, že nyní máme třídu People:
Deklarujeme kolekci objektů ListPeole:
Použijme metodu Distinct na ListPeople bez jakýchkoli parametrů a výsledek je následující:
Je vidět, že pokud metoda Distinct nemá parametry, deduplikuje p, p1, p2 v množině objektů a neexistuje deduplikace pro různé objekty se stejnou hodnotou člena objektu. Nyní máme požadavek, aby lidé se stejným ID, počítáme jako stejná osoba, vypisovali ne-duplicitní osoby v sadě (stačí vydat jednu pro stejné ID), v tuto chvíli používáme druhou metodu Distinct, která vyžaduje, aby parametry předané byly typu IEqualityComparer, dědí obecné rozhraní, přidáváme následující kód:
Děděním rozhraní IEqualityComparer musíte implementovat metody Equals a GetHashCode. Při porovnání můžeme vložit entitu s PeopleCompareByID:
Výsledky závodu jsou následující:
Dosáhli jsme efektu deduplikace pomocí ID. Nyní se požadavky opět změnily, ID a provincie jsou jedna osoba, která může vygenerovat informace o osobě (ta samá může vydat informace podle libosti), v tuto chvíli vidíme, že ID=0 a Province="Hubei" jsou duplikovány, pro deduplikaci máme další třídu, nebo dědíme z IEqualityComparer:
Podobně při použití metody Distinct je předána instance PeopleCompareByIDAndProvince:
Výsledky po běhu jsou následující:
Dosáhli jsme požadovaného efektu. Tato metoda může být použita při problému deduplikace u tří nebo více členů objektu, aby se zjistilo, zda je objekt duplikován. Výše uvedené je můj skromný názor.
|