Kod źródłowy do pobrania: https://skydrive.live.com/redir?resid=BCCBFB57B3C672D0!117
Biblioteka .NET dostarcza wiele ułatwień w dziedzinie pracy nad zbiorami.
W ramach przypomnienia matematyki:
Do pracy ze zbiorami możemy podejść na dwa sposoby:
- Metody LINQ
- Kolekcja HashSet<T>
Kiedy wybrać operacje LINQ:
- takie same wartości w kolekcji są dopuszczalne
- nie chcemy modyfikować istniejącej kolekcji (źródła) - zwracamy IEnumerable<T>
Kiedy kolekcja HashSet<T>:
- nie mogą się pojawić te same wartości więcej niż raz
- chcemy modyfikować oryginalną kolekcję
Metody LINQ:
Concat - sumuje dwa zbiory, dopuszczając do zduplikowanych wartości:
Code:
int[] set1 = { 1, 2, 3 };
int[] set2 = { 4, 5, 3 };
var result = set1.Concat(set2);
Union - sumuje dwa zbiory, jako rezultat zwracając elementy unikalne w obu zbiorach:
Code:
int[] set1 = { 1, 2, 3 };
int[] set2 = { 4, 5, 3 };
var result = set1.Union(set2);
Distinct - zwraca tylko elementy unikalne:
Code:
int[] set1 = { 1, 2, 3, 3, 4, 5, 3, 2, 1, 4, 5, 6, 7, 4, 5, 6, 3 };
var result = set1.Distinct();
Expect - różnica - wartości w pierwszym zbiorze, które nie występują w drugim:
Code:
int[] set1 = { 1, 2, 3 };
int[] set2 = { 4, 5, 3 };
var result = set1.Except(set2);
Intersect - przecięcie zbiorów czyli część wspólna:
Code:
int[] set1 = { 1, 2, 3, 4 ,5 };
int[] set2 = { 4, 5, 3 };
var result = set1.Intersect(set2);
Rezultaty operacji:
Kolekcja HashSet<T>
Kolekcja ta została dodana w .NET wersji 3.5 czyli można rzec "dość późno". Jest to kolekcja oparta na kluczach, zawierająca tylko wartości unikalne. Dzięki swojej budowie operacje wyszukiwania, sprawdzania czy dany element już istnieje w kolekcji czy też usuwanie elementu mają złożoność liniową O(1). Operacje wywoływane na kolekcji powodują zmianę oryginalnej kolekcji. Aby odróżnić metody LINQ od HashSet<T> metody kolekcji posiadają słówko With np. UnionWith, IntersectWith:
Code:
var set1 = new HashSet<int>(new int[] { 1, 2, 3 });
var set2 = new HashSet<int>(new int[] { 3, 4, 5 });
set1.UnionWith(set2);
Porównanie metod dla metod LINQ i kolekcji HashSet<T>:
Oczywiście metody które nie występują w LINQ łatwo można dopisać, np. dla operacji SetEquals kod LINQ będzie wyglądać następująco:
Code:
a.Distinct().OrderBy(x => x).SequenceEqual(b.Distinct().OrderBy(y => y));