LINQ Intersect By

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 IEqualityCompareruma 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:

  • TSourcerepresenta o tipo de elementos nas sequências de entrada, enquanto TKeyrepresenta o tipo de chave usada para identificar os elementos.
  • firsté um IEnumerable<TSource>.
  • secondé um IEnumerable<TKey>.
  • keySelectoré uma função Func<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 Personclasse com duas propriedades SSNe 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 SSNpropriedade.

No Intersect()tutorial, você deve implementar o IEqualityComparerque compara dois objetos Person pela SSNchave.

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 Personobjetos:

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 e TKeyé SSN.
  • funcionário1 é IEnumerable<Funcionário>
  • employees2.Select(e => e. SSN) retorna uma IEnumerable<string> que contém uma sequência de SSN.
  • O e => e. SSNé uma função seletora de chave que retorna SSNcomo 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 Salaryregistros Employeecom os elementos da salarieslista. Ele retorna um IEnumerable<Employee>que contém dois registros.

Mesmo Sarah Davistendo um salário de 100000, o IntersectBy()método retorna apenas os valores distintos. Neste caso, Jane Doeaparece 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.

Deixe um comentário

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