niedziela, 4 listopada 2012

Operacje na zbiorach

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:
  1. Metody LINQ
  2. 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));

Brak komentarzy:

Prześlij komentarz