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