Resumo : neste tutorial, você aprenderá como usar o Intersect()
método LINQ para encontrar os elementos comuns que existem em ambas as sequências de entrada.
Introdução ao método LINQ Intersect()
O método LINQ Intersect()
permite encontrar os elementos comuns que existem em ambas as sequências de entrada.
Aqui está a sintaxe do Intersect()
método:
IEnumerable<TSource> Intersect<TSource> (
this IEnumerable<TSource> first,
IEnumerable<TSource> second
);
Linguagem de código: C# ( cs )
O Intersect()
método aceita duas sequências de entrada como parâmetros first
e second
. Ambos têm o IEnumerable<T>
tipo.
O Intersect()
método retorna uma nova sequência com o tipo IEnumerable<T>
que contém os elementos comuns das sequências first
e second
.
O Intersect()
método usa o comparador de igualdade padrão para comparar elementos nas sequências first
e second
. Isso significa que o Intersect()
método compara os elementos nas sequências por suas referências, se forem objetos, ou por seus valores, se forem tipos primitivos.
Se quiser substituir o comparador de igualdade padrão, você pode definir um comparador de igualdade personalizado implementando a IEqualityComparer
interface e passando o objeto comparador de igualdade do cliente para a segunda sobrecarga do Intersect()
método da seguinte maneira:
IEnumerable<TSource> Intersect<TSource> (
this IEnumerable<TSource> first,
IEnumerable<TSource> second,
IEqualityComparer<TSource>? comparer
);
Linguagem de código: C# ( cs )
Exemplos do método LINQ Intersect()
Vejamos alguns exemplos de uso do Intersect()
método LINQ.
1) Usando o método LINQ Intersect() para encontrar os elementos comuns de duas sequências de números
O exemplo a seguir usa o Intersect()
método para encontrar os números que existem em ambas as listas de números:
using static System.Console;
var numbers1 = new List<int>() { 1, 2, 3, 4 };
var numbers2 = new List<int>() { 2, 3, 4, 5 };
var commonNumbers = numbers1.Intersect(numbers2);
foreach (var number in commonNumbers)
{
WriteLine(number);
}
Linguagem de código: C# ( cs )
Saída:
2
3
4
2) Usando o método LINQ Intersect() para encontrar os elementos comuns de duas sequências de strings
O exemplo a seguir usa o Intersect()
método para encontrar os elementos comuns de duas matrizes de strings:
using static System.Console;
var mountains1 = new[] { "Everest", "Kilimanjaro", "Fuji", "Matterhorn" };
var mountains2 = new[] { "Kilimanjaro", "Fuji", "Matterhorn", "Denali" };
var mountains = mountains1.Intersect(mountains2);
foreach (var mountain in mountains)
{
WriteLine(mountain);
}
Linguagem de código: C# ( cs )
Saída:
Kilimanjaro
Fuji
Matterhorn
3) Usando o método LINQ Intersect() para encontrar os elementos comuns de duas sequências de objetos
Suponha que você tenha uma Person
classe com duas propriedades SSN
e Name
:
public class Person
{
public required string SSN
{
get; set;
}
public required string Name
{
get; set;
}
public override string ToString() => $"{Name} <{SSN}>";
}
Linguagem de código: C# ( cs )
E você deseja comparar dois Person
objetos por seus arquivos SSN
. Em outras palavras, duas pessoas são iguais se tiverem o mesmo SSN
.
Para fazer isso você pode definir o PersonComparer
que implementa a IEqualityComparer
interface da seguinte forma:
public class PersonComparer : IEqualityComparer<Person>
{
public bool Equals(Person? x, Person? y)
{
// Check for null values
if (x == null || y == null)
return false;
// Check if the two Person objects are the same reference
if (ReferenceEquals(x, y))
return true;
// Compare the SSN of the two Person objects
// to determine if they're the same
return x.SSN == y.SSN;
}
public int GetHashCode(Person? obj)
{
if (obj == null || obj.SSN == null)
return 0;
// Use the SSN of the Person object
// as the hash code
return obj.SSN.GetHashCode();
}
}
Linguagem de código: C# ( cs )
O programa a seguir usa o Intersect()
método com PersonComparer
para localizar Person
objetos que aparecem em ambas as listas:
using static System.Console;
var employees1 = new List<Person>
{
new Person() { SSN="123456781", Name="John Doe" },
new Person() { SSN="123456782", Name="Jane Doe" },
new Person() { SSN="123456783", Name="William Brown" },
new Person() { SSN="123456784", Name="Sarah Davis" },
};
var employees2 = new List<Person>
{
new Person() { SSN="123456781", Name="John Doe" },
new Person() { SSN="123456782", Name="Jane Doe" },
new Person() { SSN="123456784", Name="Sarah Davis" },
new Person() { SSN="123456785", Name="Emily Johnson" },
};
var employees = employees1.Intersect(
employees2,
new PersonComparer()
);
foreach (var employee in employees)
{
WriteLine(employee);
}
Linguagem de código: C# ( cs )
Saída:
John Doe <123456781>
Jane Doe <123456782>
Sarah Davis <123456784>
Linguagem de código: C# ( cs )
Resumo
- Use o método LINQ
Intersect()
para retornar os elementos que existem em ambas as sequências de entrada. - Use um comparador de igualdade personalizado para substituir o comparador de igualdade padrão.