Interseção LINQ

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 firste second.

O Intersect()método usa o comparador de igualdade padrão para comparar elementos nas sequências firste 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 IEqualityComparerinterface 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 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ê deseja comparar dois Personobjetos por seus arquivos SSN. Em outras palavras, duas pessoas são iguais se tiverem o mesmo SSN.

Para fazer isso você pode definir o PersonComparerque implementa a IEqualityComparerinterface 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 PersonComparerpara localizar Personobjetos 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.

Deixe um comentário

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