LINQ Exceto por

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é um IEnumerable<TSource>cujas chaves que não estiverem no segundo serão incluídas no resultado.
  • secondé um IEnumable<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 Personclasse com duas propriedades SSNe 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 SSNcandidatos 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é a Personclasse e TKeyé SSNpropriedade da Personclasse.
  • candidateslista é aIEnumerable<TSource>
  • employees.Select(e => e.SSN)retorna um IEnumerable<TKey>que contém uma sequência de SSNsfuncionários.
  • e => e.SSNé a função seletora de chave que retorna a SSNchave para comparação Personde 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,000ou 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.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *