Resumo : neste tutorial, você aprenderá como usar o DistinctBy()
método LINQ para retornar elementos distintos de uma sequência de acordo com uma função de seletor de chave especificada.
Introdução ao método LINQ DistinctBy
O DistinctBy()
método permite obter elementos distintos de uma sequência com base em uma função de seletor de chave especificada.
Aqui está a sintaxe do DistinctBy()
método:
IEnumerable<TSource> DistinctBy<TSource,TKey> (
this IEnumerable<TSource> source,
Func<TSource,TKey> keySelector
);
Linguagem de código: C# ( cs )
Nesta sintaxe:
TSource
é o tipo de elementos dasource
sequência.TKey
é o tipo de chave usada para distinguir elementos.source
é a sequência de entrada com oIEnumerable<T>
tipo.keySelector
é uma função que extrai a chave de cada elemento.
O DistinctBy
método retorna um IEnumerable<T>
que contém elementos exclusivos da sequência de origem.
Exemplo do método LINQ DistinctBy()
Suponha que você tenha uma Product
classe que tenha Id
, Name
e Price
:
public 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}";
}
}
Linguagem de código: C# ( cs )
O exemplo a seguir usa o DistinctBy()
método para encontrar produtos exclusivos por Id
:
using static System.Console;
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 results = products.DistinctBy(p => p.Id);
foreach (var product in results)
{
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 )
Neste exemplo, usamos a seguinte função seletora de chave para o DistinctBy()
método:
p => p.Id
Linguagem de código: C# ( cs )
A função seletora de chave aceita um argumento que é uma instância da Product
classe. Retorna a Id
propriedade usada para comparar os objetos do produto.
Observe que sem o DistinctBy()
método, você deve definir um comparador de igualdade personalizado ( IEqualityComparer
) para comparar dois produtos por ID.
Para obter produtos distintos por Name
, você usa uma função de seletor de chave diferente que retorna a Name
propriedade de um produto:
using static System.Console;
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 results = products.DistinctBy(p => p.Name);
foreach (var product in results)
{
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 )
Resumo
- Use o
DistinctBy()
método para retornar elementos distintos de uma sequência de acordo com uma função de seletor de chave especificada.