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:
TSource
representa o tipo de elementos na primeira e segunda sequências.first
é umIEnumerable<T>
cujos elementos distintos criam o primeiro conjunto para a união.second
é também umIEnumerable<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
5
Linguagem 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
Bob
Linguagem 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 SSN
e 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 PersonComparer
que compara Person
objetos 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 PersonComparer
para encontrar a união de duas sequências de Person
objetos:
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.