Resumo : neste tutorial, você aprenderá como usar o Distinct()
método LINQ para retornar elementos distintos de uma sequência.
Introdução ao método LINQ Distinct()
LINQ Distinct()
é um método de extensão que retorna elementos únicos de uma sequência:
IEnumerable<TSource> Distinct<TSource>(
this IEnumerable<TSource> source
)
Linguagem de código: C# ( cs )
Nesta sintaxe:
TSource
é o tipo de elemento da sequência de entrada.source
é a sequência de entrada.
O Distinct()
método retorna um IEnumerable<T>
objeto que contém elementos distintos da sequência de origem. Observe que o resultado é uma sequência não ordenada.
O Distinct()
método usa um comparador de igualdade padrão para identificar elementos exclusivos na sequência. Se quiser usar um comparador de igualdade personalizado, você pode usar a seguinte sobrecarga do Distinct()
método:
IEnumerable<TSource> Distinct<TSource>(
this IEnumerable<TSource> source,
IEqualityComparer<TSource>? comparer
);
Linguagem de código: C# ( cs )
Nesta sintaxe, você passa um comparador de igualdade ao Distinct()
método para comparar dois elementos e identificar a distinção.
Exemplos de métodos LINQ Distinct()
Vejamos alguns exemplos de uso do Distinct()
método LINQ.
1) Usando o método LINQ Distinct() para obter uma sequência de números exclusivos
O programa a seguir demonstra como usar o Distinct()
método LINQ para obter uma sequência de números exclusivos de uma matriz de inteiros.
using static System.Console;
int[] scores = { 1, 2, 2, 3, 4, 4, 5 };
var uniqueScores = scores.Distinct();
foreach (var score in uniqueScores)
{
Write($"{score} ");
}
Linguagem de código: C# ( cs )
Saída:
1 2 3 4 5
Linguagem de código: C# ( cs )
Como funciona.
Primeiro, declare e inicialize o array de pontuações com sete inteiros:
int[] scores = { 1, 2, 2, 3, 4, 4, 5 };
Linguagem de código: C# ( cs )
Segundo, use Distinct()
o método para retornar uma nova sequência que contém apenas números exclusivos da matriz de pontuações. Neste caso, ele retorna {1,2,3,4,5}
:
var uniqueScores = scores.Distinct();
Linguagem de código: C# ( cs )
Terceiro, escreva cada número no uniqueScores
console usando um foreach
loop e Write()
um método:
foreach (var score in uniqueScores)
{
Write($"{score} ");
}
Linguagem de código: C# ( cs )
2) Usando o método LINQ Distinct() para obter uma sequência de strings exclusivas
O programa a seguir demonstra como usar o Distinct()
método para retornar valores de string exclusivos de uma matriz dos oceanos mais populares:
using static System.Console;
string[] oceans = {
"Pacific",
"Atlantic",
"Indian",
"Southern",
"Arctic",
"Atlantic", // duplicate
"Pacific" // duplicate
};
var uniqueOceans = oceans.Distinct();
foreach (string ocean in uniqueOceans)
{
WriteLine(ocean);
}
Linguagem de código: C# ( cs )
Saída:
Pacific
Atlantic
Indian
Southern
Arctic
Linguagem de código: C# ( cs )
Como funciona.
Primeiro, declare uma matriz de strings chamada oceanos que contém os oceanos mais populares. A matriz contém os valores duplicados de “Atlântico” e “Pacífico”.
Segundo, use o Distinct()
método para retornar uma nova sequência que contém apenas valores de string exclusivos da matriz oceans.
Terceiro, escreva cada valor de string na sequência oceans no console usando um foreach
loop e WriteLine
um método.
3) Usando o método LINQ Distinct() para retornar uma sequência de objetos únicos
O programa a seguir demonstra como usar o Distinct()
método para recuperar produtos exclusivos de uma lista de produtos:
using static System.Console;
class Product
{
public int? Id { get; set; }
public string? Name { get; set; }
public decimal? Price { get; set; }
public override string ToString()
{
return $"{Id} {Name} {Price:C}";
}
}
// Define a custom ProductComparer class that compares
// Product objects based on their id
class ProductComparer : IEqualityComparer<Product>
{
public bool Equals(Product? x, Product? y)
{
// Check for null values
if (x == null || y == null)
return false;
// Check if the two Product objects are the same reference
if (ReferenceEquals(x, y))
return true;
// Compare the Id of the two Product objects
// to determine if they're the same
return x.Id == y.Id;
}
public int GetHashCode(Product? obj)
{
if (obj == null || obj.Id == null)
return 0;
return obj.Id.GetHashCode();
}
}
class Program
{
static void Main(string[] args)
{
// Create a List of Product objects
List<Product> products = new() {
new Product { Id =1, Name = "A", Price=9.99M },
new Product { Id =2, Name = "B", Price=15.99M },
new Product { Id =3, Name = "C", Price=5.99M },
new Product { Id =1, Name = "A", Price=9.99M },
new Product { Id =2, Name = "B", Price=15.99M },
};
var uniqueProducts = products.Distinct(new ProductComparer());
foreach (var product in uniqueProducts)
{
WriteLine(product);
}
}
}
Linguagem de código: C# ( cs )
Saída:
1 A $9.99
2 B $15.99
3 C $5.99
Linguagem de código: C# ( cs )
Como funciona.
Primeiro, defina uma Product
classe que possua três propriedades Id, Name e Price.
A seguir, defina o ProductComparer
que compara dois produtos e retorna verdadeiro se dois produtos tiverem o mesmo id.
Em seguida, crie uma nova lista de produtos com cinco objetos Produto. Observe que a lista contém Product
objetos duplicados.
Depois disso, recupere objetos Product exclusivos da lista usando o Distinct()
método. O Distinct()
método usa um ProductComparer
objeto para identificar os produtos exclusivos.
Finalmente, escreva cada produto no console usando um foreach
loop e o Writeline
método.
Resumo
- Use o método LINQ
Distinct()
para recuperar elementos exclusivos de uma sequência.