Resumo : neste tutorial, você aprenderá como usar o ExceptBy()
método LINQ para encontrar a diferença definida entre duas sequências por uma função de seletor de chave.
Introdução ao método LINQ ExceptBy()
O ExceptBy()
método retorna elementos únicos da primeira sequência que não aparecem na segunda sequência por uma função seletora de chave.
Aqui está a sintaxe do ExceptBy()
método:
IEnumerable<TSource> ExceptBy<TSource> (
this IEnumerable<TSource> first,
IEnumerable<TKey> second,
Func<TSource,TKey> keySelector
);
Linguagem de código: C# ( cs )
Nesta sintaxe:
TSource
é o tipo de elemento da sequência de entrada.TKey
é o tipo de chave que o método usa para identificar os elementos.first
é umIEnumerable<TSource>
cujas chaves que não estiverem no segundo serão incluídas no resultado.second
é umIEnumable<TKey>
cujas chaves que ocorrem na primeira sequência farão com que esses elementos sejam excluídos do resultado.keySelector
é uma função que extrai a chave de cada elemento.
O ExceptBy()
método retorna um IEnumerable<TSource>
que contém a diferença definida dos elementos da primeira e da segunda sequências.
Exemplos do método LINQ ExceptBy()
Vejamos alguns exemplos de uso do ExceptBy()
método LINQ.
1) Usando o LINQ ExceptBy para encontrar as diferenças definidas entre duas sequências de objetos
Suponha que você tenha a seguinte Person
classe com duas propriedades SSN
e Nome:
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 )
O exemplo a seguir usa o ExceptBy()
método para retornar candidatos que não são funcionários, comparando os SSN
candidatos com os funcionários:
using static System.Console;
var candidates = new List<Person>
{
new Person() { SSN="1234567890", Name="John Doe" },
new Person() { SSN="1234567891", Name="Jane Doe" },
new Person() { SSN="1234567892", Name="Emily Johnson" },
new Person() { SSN="1234567893", Name="William Brown" },
new Person() { SSN="1234567894", Name="Sarah Davis" },
};
var employees = new List<Person>
{
new Person() { SSN="1234567890", Name="John Doe" },
new Person() { SSN="1234567891", Name="Jane Doe" }
};
var potentialCandidates = candidates.ExceptBy(
employees.Select(e => e.SSN),
e => e.SSN
);
foreach (var candidate in potentialCandidates)
{
WriteLine(candidate);
}
Linguagem de código: C# ( cs )
Saída:
Emily Johnson <1234567892>
William Brown <1234567893>
Sarah Davis <1234567894>
Linguagem de código: texto simples ( texto simples )
No código a seguir:
var potentialCandidates = candidates.ExceptBy(
employees.Select(e => e.SSN),
e => e.SSN
);
Linguagem de código: C# ( cs )
Como funciona.
TSource
é aPerson
classe eTKey
éSSN
propriedade daPerson
classe.candidates
lista é aIEnumerable<TSource>
employees.Select(e => e.SSN)
retorna umIEnumerable<TKey>
que contém uma sequência deSSNs
funcionários.e => e.SSN
é a função seletora de chave que retorna aSSN
chave para comparaçãoPerson
de objetos nas listas de candidatos e funcionários.
2) Usando o método LINQ ExceptBy para encontrar as diferenças definidas entre duas sequências de formatos de objetos diferentes
O exemplo a seguir usa o ExceptBy()
método para localizar todos os funcionários, exceto aqueles que têm salário de 100,000
ou 120,000
:
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", 120_000),
new Employee("John Doe", 100_000),
new Employee("Sarah Davis", 100_000),
new Employee("Emily Johnson", 150_000),
new Employee("Alice Miller", 130_000)
};
var salaries = new decimal[] { 120_000, 100_000 };
var results = employees.ExceptBy(salaries, e => e.Salary);
foreach (var employee in results)
{
WriteLine(employee);
}
}
}
Linguagem de código: C# ( cs )
Saída:
Employee { Name = Emily Johnson, Salary = 150000 }
Employee { Name = Alice Miller, Salary = 130000 }
Linguagem de código: texto simples ( texto simples )
Resumo
- Use o método LINQ
ExceptBy()
para recuperar os elementos da primeira sequência que não aparecem na segunda sequência, comparando os elementos por uma função de seletor de chave.