LINQ i kolekcje obiektów - Operacje na zbiorach  Udostępnij na: Facebook

Autor: Paweł Sołtysiak

Opublikowano: 2012-03-16

LINQ posiada cztery operatory, które pozwalają na traktowanie kolekcji obiektów jako matematycznego zbioru. Distinct usuwa z kolekcji powtarzające się obiekty. Union łączy dwa zbiory w jeden. Intersect tworzy cześć wspólną zbiorów. Except służy do obliczania różnicy zbiorów. Dzięki tym operatorom nie musimy pisać własnych funkcji, wykonujących podobne zadania.

Przed wykonaniem zadań powinieneś wiedzieć:

  • jak utworzyć nowy projekt konsolowy w Visual Studio (od wersji 2008),
  • jak posługiwać się tablicami oraz kolekcjami.

Po wykonaniu zadań nauczysz się:

  • jak usunąć elementy powtarzające się w kolekcji, używając operatora Distinct,
  • jak połączyć, przy pomocy Union, dwa zbiory w jeden,
  • jak utworzyć zbiór wspólny dwóch kolekcji, korzystając z operatora Intersect,
  • jak obliczyć różnicę zbiorów za pomocą operatora Except.

Implementacja

W Visual Studio (od wersji 2008) utwórz nowy projekt konsolowy dla języka C#.

W następnych ćwiczeniach poznasz możliwości czterech operatorów LINQ: Distinct, Union, Intersect, Except.

Operator Distinct

Używając operatora Distinct, utworzymy nową kolekcję, która nie będzie posiadała powtarzających się elementów.

  1. Utwórz plik o nazwie Program.cs
  2. Wewnątrz funkcji Main wpisz:
int[] factorsOf300 = { 2, 2, 3, 5, 5 };

var uniqueFactors = factorsOf300.Distinct();

Console.WriteLine("Czynniki pierwsze liczby 300:");
foreach (var f in uniqueFactors)
{
    Console.WriteLine(f);
}
  1. Uruchom program za pomocą Debug -> Start Without Debugging (Ctrl+F4).
  2. Powinien uruchomić się program wyświetlający liczby z nowej kolekcji, które nie powinny się powtarzać. Sytuacja zaprezentowana została na Rys. 1.

Rys. 1. Liczby z kolekcji bez powtórzeń.

Operator Union

Operator Union łączy dwa zbiory ze sobą, tworząc nową kolekcję. Ta kolekcja nie posiada powtarzających się elementów.

  1. Zamień kod z poprzedniego zadania następującym kodem:
int[] numbersA = { 0, 2, 4, 5, 6, 8, 9 };
int[] numbersB = { 1, 3, 5, 7, 8 };

var uniqueNumbers = numbersA.Union(numbersB);

Console.WriteLine("Liczby bez powtórzeń z dwóch kolekcji:");
foreach (var n in uniqueNumbers)
{
    Console.WriteLine(n);
}
  1. Uruchom program za pomocą Debug -> Start Without Debugging (Ctrl+F4).
  2. Powinien uruchomić się program wyświetlający liczby z obu kolekcji, bez powtarzających się elementów. Sytuację zaprezentowano na Rys. 2.

Rys. 2. Liczby z dwóch kolekcji bez powtarzających się elementów.

Operator Intersect

Operator Intersect tworzy nową kolekcję, w której znajduje się część wspólna z dwóch kolekcji.

  1. Zamień kod z poprzedniego zadania następującym kodem:
int[] numbersA = { 0, 2, 4, 5, 6, 8, 9 };
int[] numbersB = { 1, 3, 5, 7, 8 };

var commonNumbers = numbersA.Intersect(numbersB);

Console.WriteLine("Liczby znajdujące się w obu kolekcjach:");
foreach (var n in commonNumbers)
{
    Console.WriteLine(n);
}
  1. Uruchom program za pomocą Debug -> Start Without Debugging (Ctrl+F4).
  2. Powinien uruchomić się program wyświetlający liczby, znajdujące się jednocześnie w obu tablicach. Sytuację zilustrowano na Rys. 3.

Rys. 3. Liczby znajdujące się w obu kolekcjach.

Operator Except

Operator Except tworzy nową kolekcję, w której znajduje się różnica zbiorów.

  1. Zamień kod z poprzedniego zadania następującym kodem:
int[] numbersA = { 0, 2, 4, 5, 6, 8, 9 };
int[] numbersB = { 1, 3, 5, 7, 8 };

var aOnlyNumbers = numbersA.Except(numbersB);

Console.WriteLine("Liczby w pierwszej, ale nie drugiej kolekcji:");
foreach (var n in aOnlyNumbers)
{
    Console.WriteLine(n);
}
  1. Uruchom program za pomocą Debug -> Start Without Debugging (Ctrl+F4).
  2. Powinien uruchomić się program wyświetlający liczby z kolekcji aOnlyNumbers. Sytuację przedstawiono na Rys. 4.

Rys. 4. Liczby znajdujące się w jednej, a nie w drugiej, kolekcji.

Podsumowanie

W tym artykule nauczyłeś się, jak przeprowadzać podstawowe operacje na zbiorach. Dowiedziałeś się o możliwości usuwania powtarzających się elementów z kolekcji przy użyciu operatora Distinct. Zapoznałeś się z operatorem Union, który łączy dwa zbiory w jeden. Następnie, dowiedziałeś się o możliwości tworzenia części wspólnej z dwóch kolekcji, korzystając z operatora Intersect. Na końcu, poznałeś operator Except, wykonujący operację różnicy zbiorów.

W kolejnym artykule nauczymy się, jak wybierać pojedyncze elementy z kolekcji.