LINQ DistinctBy

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 da sourcesequência.
  • TKeyé o tipo de chave usada para distinguir elementos.
  • sourceé a sequência de entrada com o IEnumerable<T>tipo.
  • keySelectoré uma função que extrai a chave de cada elemento.

O DistinctBymé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 Productclasse que tenha Id, Namee 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.99Linguagem de código:  C#  ( cs )

Neste exemplo, usamos a seguinte função seletora de chave para o DistinctBy()método:

p => p.IdLinguagem de código:  C#  ( cs )

A função seletora de chave aceita um argumento que é uma instância da Productclasse. Retorna a Idpropriedade 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 Namepropriedade 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.99Linguagem 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.

Deixe um comentário

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