LINQ distinto

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 5Linguagem 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 uniqueScoresconsole usando um foreachloop 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
ArcticLinguagem 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 foreachloop e WriteLineum 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.99Linguagem de código:  C#  ( cs )

Como funciona.

Primeiro, defina uma Productclasse que possua três propriedades Id, Name e Price.

A seguir, defina o ProductComparerque 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 Productobjetos duplicados.

Depois disso, recupere objetos Product exclusivos da lista usando o Distinct()método. O Distinct()método usa um ProductComparerobjeto para identificar os produtos exclusivos.

Finalmente, escreva cada produto no console usando um foreachloop e o Writelinemétodo.

Resumo

  • Use o método LINQ Distinct()para recuperar elementos exclusivos de uma sequência.

Deixe um comentário

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