União LINQ

Resumo : neste tutorial, você aprenderá como usar o Union()método LINQ para produzir a união definida de duas sequências.

Introdução ao método LINQ Union()

O Union()método retorna a união de duas sequências. Aqui está a sintaxe do Union()método:

IEnumerable<TSource> Union<TSource> (
    this IEnumerable<TSource> first, 
    IEnumerable<TSource> second
);Linguagem de código:  C#  ( cs )

Nesta sintaxe:

  • TSourcerepresenta o tipo de elementos na primeira e segunda sequências.
  • firsté um IEnumerable<T>cujos elementos distintos criam o primeiro conjunto para a união.
  • secondé também um IEnumerable<T>cujos elementos distintos criam o segundo conjunto da união.

O Union()retorna um IEnumerable<T>que contém os elementos exclusivos que aparecem na primeira e na segunda sequências.

O Union()método usa o comparador de igualdade padrão. Isso significa que o método comparará os elementos por valor se forem tipos primitivos ou por referências se forem objetos.

Para criar uma união de tipo customizado, você pode definir uma classe que implemente a IEqualityComparer<T>interface e passar o objeto comparador de igualdade customizado para outra sobrecarga do Union()método:

IEnumerable<TSource> Union<TSource> (
    this IEnumerable<TSource> first, 
    IEnumerable<TSource> second, 
    IEqualityComparer<TSource>? comparer
);Linguagem de código:  C#  ( cs )

Exemplos de métodos LINQ Union()

Vejamos alguns exemplos de uso do Union()método LINQ.

1) Usando o método LINQ Union() com sequências de números

O exemplo a seguir usa o Union()método para criar uma união de sequências de inteiros. Como o inteiro é um tipo primitivo, o Union()método os compara por valores:

using static System.Console;

var numbers1 = new List<int>() { 1, 2, 2, 3 };
var numbers2 = new List<int>() { 2, 3, 3, 4, 5 };

var numbers = numbers1.Union(numbers2);

foreach (var number in numbers)
{
    WriteLine(number);
}Linguagem de código:  C#  ( cs )

Saída:

1
2
3
4
5Linguagem de código:  C#  ( cs )

A saída mostra que o resultado do Union()método contém números exclusivos que aparecem nas sequências de entrada.

2) Usando o método LINQ Union() com sequências de strings

O exemplo a seguir usa o Union()método para criar uma união de strings:

using static System.Console;

var names1 = new List<string>() { "John", "Jane", "Joe" };
var names2 = new List<string>() { "Jane", "Alice", "Bob" };

var names = names1.Union(names2);

foreach (var name in names)
{
    WriteLine(name);
}Linguagem de código:  C#  ( cs )

Saída:

John
Jane
Joe
Alice
BobLinguagem de código:  C#  ( cs )

3) Usando o método LINQ Union() com sequências de objetos

Para criar uma união de um tipo personalizado, você pode criar um comparador de igualdade personalizado ou usar um UnionBy()método.

Suponha que você tenha uma classe Person 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 )

Duas pessoas são iguais se tiverem o mesmo SSN. Para impor isso, você define um PersonComparerque compara Personobjetos por SSN:

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 exemplo a seguir usa o Union()método com a PersonComparerpara encontrar a união de duas sequências de Personobjetos:

using static System.Console;

var team1 = new List<Person>
{
    new Person() { SSN="123456781", Name="John Doe" },
    new Person() { SSN="123456782", Name="Jane Doe" },
    new Person() { SSN="123456783", Name="William Brown" },
};

var team2 = new List<Person>
{
    new Person() { SSN="123456781", Name="John Doe" },
    new Person() { SSN="123456784", Name="Sarah Davis" },
};

var team = team1.Union(team2);

foreach (var person in team)
{
    WriteLine(person);
}Linguagem de código:  C#  ( cs )

Saída:

John Doe <123456781>
Jane Doe <123456782>
William Brown <123456783>
Sarah Davis <123456784>Linguagem de código:  C#  ( cs )

Resumo

  • Use o método LINQ Union()para criar uma união de duas sequências, que contém elementos exclusivos de ambas as sequências.

Deixe um comentário

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