MySQL Java JavaScript PHP Python HTML-CSS C-sharp

Unirea, intersectarea și diferența colecțiilor

LINQ oferă mai multe metode pentru a lucra cu colecțiile ca și cu mulțimile, și anume pentru a găsi diferența, unirea și intersectarea acestora.

Diferența secvențelor

Cu ajutorul metodei Except() se poate obține diferența dintre două secvențe:

string[] soft = { "Microsoft", "Google", "Apple" };
string[] hard = { "Apple", "IBM", "Samsung" };

// diferența secvențelor
var result = soft.Except(hard);

foreach (string s in result)
   Console.WriteLine(s);

În acest caz, din array-ul soft sunt eliminate toate elementele care există în array-ul hard. Rezultatul operației va fi două elemente:

Microsoft
Google

Intersectarea secvențelor

Pentru a obține intersectarea secvențelor, adică elementele comune pentru ambele seturi, se folosește metoda Intersect:

string[] soft = { "Microsoft", "Google", "Apple" };
string[] hard = { "Apple", "IBM", "Samsung" };

// intersectarea secvențelor
var result = soft.Intersect(hard);

foreach (string s in result)
   Console.WriteLine(s);

Deoarece ambele seturi au doar un singur element comun, doar acesta va fi inclus în selecția rezultată:

Apple

Eliminarea duplicatelor

Pentru a elimina duplicatele dintr-un set se utilizează metoda Distinct:

string[] soft = { "Microsoft", "Google", "Apple", "Microsoft", "Google" };

// eliminarea duplicatelor
var result = soft.Distinct();

foreach (string s in result)
   Console.WriteLine(s);

Rezultatul:

Microsoft
Google
Apple

Unirea secvențelor

Pentru a uni două secvențe se utilizează metoda Union. Rezultatul său este un nou set care conține elemente atât din prima cât și din a doua secvență. Elementele duplicate sunt adăugate în rezultat doar o singură dată:

string[] soft = { "Microsoft", "Google", "Apple" };
string[] hard = { "Apple", "IBM", "Samsung" };

// unirea secvențelor
var result = soft.Union(hard);

foreach (string s in result)
   Console.WriteLine(s);

Rezultatul operației va fi următorul set:

Microsoft
Google
Apple
IBM
Samsung

Dacă dorim o simplă concatenare a celor două seturi, putem folosi metoda Concat:

var result = soft.Concat(hard);

În acest caz, elementele care apar în ambele seturi se vor dubla în secvența rezultată.

Aplicarea consecutivă a metodelor Concat și Distinct va fi similară cu acțiunea metodei Union.

Lucrul cu obiecte complexe

Pentru compararea obiectelor în secvențe se folosesc implementările metodelor GetHashCode() și Equals(). Prin urmare, dacă dorim să lucrăm cu secvențe care conțin obiecte ale claselor sau structurilor proprii, trebuie să definim aceste metode pentru ele:

Person[] students = { new Person("Tom"), new Person("Bob"), new Person("Sam") };
Person[] employees = { new Person("Tom"), new Person("Bob"), new Person("Mike") };

// unirea secvențelor
var people = students.Union(employees);

foreach (Person person in people)
   Console.WriteLine(person.Name);

class Person
{
   public string Name { get; }
   public Person(string name) => Name = name;

   public override bool Equals(object? obj)
   {
       if (obj is Person person) return Name == person.Name;
       return false;
   }

   public override int GetHashCode() => Name.GetHashCode();
}

Aici, obiectele Person sunt comparate pe baza valorii proprietății lor Name - dacă numele sunt egale, și obiectele Person sunt egale. Afișarea pe consolă:

Tom
Bob
Sam
Mike
← Lecția anterioară Lecția următoare →