Resumo : neste tutorial, você aprenderá como usar o IntersectBy()
método LINQ para encontrar a interseção definida de duas sequências com base em uma função de seletor de chave especificada.
Introdução ao método LINQ IntersectBy()
O Intersect()
método retorna uma sequência que contém elementos que apareceram em ambas as sequências de entrada. Funciona muito bem para números e strings.
Quando se trata de encontrar a interseção de duas sequências de objetos, muitas vezes é necessário implementar IEqualityComparer
uma interface e usá-la para comparar dois objetos.
O .NET 6 resolveu esse problema introduzindo o IntersectBy()
método. O IntersectBy()
método permite encontrar a interseção definida de duas sequências com base em uma função de seletor de chave especificada .
Aqui está a sintaxe do IntersectBy()
método:
IEnumerable<TSource> IntersectBy<TSource,TKey> (
this IEnumerable<TSource> first,
IEnumerable<TKey> second,
Func<TSource,TKey> keySelector
);
Linguagem de código: C# ( cs )
Nesta sintaxe:
TSource
representa o tipo de elementos nas sequências de entrada, enquantoTKey
representa o tipo de chave usada para identificar os elementos.first
é umIEnumerable<TSource>
.second
é umIEnumerable<TKey>
.keySelector
é uma funçãoFunc<TSource,TKey>
que extrai uma chave de cada elemento.
O IntersectBy()
método retorna uma sequência contendo elementos que formam a interseção do conjunto da primeira e da segunda sequências.
O IntersectBy()
método retorna elementos distintos de ambas as sequências na ordem em que aparecem pela primeira vez .
Observe que a intersecção de dois conjuntos A e B é definida como o conjunto que contém todos os elementos de A que também aparecem em B, mas nenhum outro elemento.
Exemplo do método LINQ IntersectBy()
Vamos dar alguns exemplos para entender o IntersectBy()
método.
1) Usando LINQ IntersectBy() para encontrar a interseção de duas sequências de objetos
Suponha que temos 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ê precisa encontrar a interseção de duas listas de objetos Person pela SSN
propriedade.
No Intersect()
tutorial, você deve implementar o IEqualityComparer
que compara dois objetos Person pela SSN
chave.
No entanto, com o IntersectBy()
método, você não precisa mais de um comparador de igualdade personalizado.
Por exemplo, o programa a seguir usa o IntersectBy()
método para encontrar a interseção de duas listas de Person
objetos:
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.IntersectBy(
employees2.Select(e => e.SSN),
e => e.SSN
);
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: texto simples ( texto simples )
Vamos examinar o seguinte código:
var employees = employees1.IntersectBy(
employees2.Select(e => e.SSN),
e => e.SSN
);
Linguagem de código: C# ( cs )
Neste código:
TSource
é Funcionário eTKey
éSSN
.- funcionário1 é
IEnumerable
<Funcionário> employees2.Select
(e => e.SSN
) retorna umaIEnumerable
<string> que contém uma sequência deSSN
.- O e => e.
SSN
é uma função seletora de chave que retornaSSN
como chave para comparação.
2) Usando LINQ IntersectBy() para encontrar a interseção de duas sequências de objetos com formas diferentes
O exemplo a seguir usa o IntersectBy()
método para encontrar a interseção de uma lista de Employee
registros e uma lista de salários:
using static System.Console;
public record Employee(string Name, decimal Salary);
public class Program
{
public static void Main(string[] args)
{
var employees = new List<Employee>()
{
new Employee("John Doe", 120000),
new Employee("John Doe", 100000),
new Employee("Sarah Davis", 100000),
new Employee("Emily Johnson", 150000)
};
var salaries = new decimal[] { 120000, 100000 };
var results = employees.IntersectBy(salaries, e => e.Salary);
foreach (var employee in results)
{
WriteLine(employee);
}
}
}
Linguagem de código: C# ( cs )
Saída:
Employee { Name = John Doe, Salary = 120000 }
Employee { Name = Jane Doe, Salary = 100000 }
Linguagem de código: texto simples ( texto simples )
Neste exemplo, o IntersectBy()
método compara os Salary
registros Employee
com os elementos da salaries
lista. Ele retorna um IEnumerable<Employee>
que contém dois registros.
Mesmo Sarah Davis
tendo um salário de 100000
, o IntersectBy()
método retorna apenas os valores distintos. Neste caso, Jane Doe
aparece primeiro na lista, os IntersectBy()
métodos incluem apenas Jane Doe
, não Sarah David
.
Resumo
- Use o método LINQ
IntersectBy()
para encontrar a interseção definida de duas sequências com base em uma função de seletor de chave especificada.