Ler em inglês

Partilhar via


Enumerable.Except Método

Definição

Produz a diferença de conjunto de duas sequências.

Sobrecargas

Except<TSource>(IEnumerable<TSource>, IEnumerable<TSource>)

Produz a diferença de conjunto de duas sequências usando o comparador de igualdade padrão para comparar os valores.

Except<TSource>(IEnumerable<TSource>, IEnumerable<TSource>, IEqualityComparer<TSource>)

Produz a diferença de conjunto de duas sequências usando o IEqualityComparer<T> especificado para comparar os valores.

Comentários

A diferença de conjunto de dois conjuntos é definida como os membros do primeiro conjunto que não aparecem no segundo conjunto.

Esse método retorna esses elementos em first que não aparecem em second. Ele não retorna esses elementos em second que não aparecem em first. Somente elementos exclusivos são retornados.

Except<TSource>(IEnumerable<TSource>, IEnumerable<TSource>)

Origem:
Except.cs
Origem:
Except.cs
Origem:
Except.cs

Produz a diferença de conjunto de duas sequências usando o comparador de igualdade padrão para comparar os valores.

C#
public static System.Collections.Generic.IEnumerable<TSource> Except<TSource> (this System.Collections.Generic.IEnumerable<TSource> first, System.Collections.Generic.IEnumerable<TSource> second);

Parâmetros de tipo

TSource

O tipo dos elementos das sequências de entrada.

Parâmetros

first
IEnumerable<TSource>

Um IEnumerable<T> cujos elementos que não estão presentes também no second serão retornados.

second
IEnumerable<TSource>

Um IEnumerable<T> cujos elementos que também ocorrem na primeira sequência farão com que esses elementos sejam removidos da sequência retornada.

Retornos

IEnumerable<TSource>

Uma sequência que contém a diferença de conjunto dos elementos das duas sequências.

Exceções

first ou second é null.

Exemplos

O exemplo de código a seguir demonstra como usar o Except<TSource>(IEnumerable<TSource>, IEnumerable<TSource>) método para comparar duas sequências de números e retornar elementos que aparecem apenas na primeira sequência.

C#
double[] numbers1 = { 2.0, 2.0, 2.1, 2.2, 2.3, 2.3, 2.4, 2.5 };
double[] numbers2 = { 2.2 };

IEnumerable<double> onlyInFirstSet = numbers1.Except(numbers2);

foreach (double number in onlyInFirstSet)
    Console.WriteLine(number);

/*
 This code produces the following output:

 2
 2.1
 2.3
 2.4
 2.5
*/

Se você quiser comparar sequências de objetos de algum tipo de dados personalizado, será necessário implementar a IEquatable<T> interface genérica em uma classe auxiliar. O exemplo de código a seguir mostra como implementar essa interface em um tipo de dados personalizado e substituir os GetHashCode métodos e Equals .

C#
public class ProductA : IEquatable<ProductA>
{
    public string Name { get; set; }
    public int Code { get; set; }

    public bool Equals(ProductA other)
    {
        if (other is null)
            return false;

        return this.Name == other.Name && this.Code == other.Code;
    }

    public override bool Equals(object obj) => Equals(obj as ProductA);
    public override int GetHashCode() => (Name, Code).GetHashCode();
}

Depois de implementar essa interface, você pode usar sequências de ProductA objetos no Except<TSource>(IEnumerable<TSource>, IEnumerable<TSource>) método , conforme mostrado no exemplo a seguir:

C#
ProductA[] fruits1 = { new ProductA { Name = "apple", Code = 9 },
                       new ProductA { Name = "orange", Code = 4 },
                        new ProductA { Name = "lemon", Code = 12 } };

ProductA[] fruits2 = { new ProductA { Name = "apple", Code = 9 } };

// Get all the elements from the first array
// except for the elements from the second array.

IEnumerable<ProductA> except =
    fruits1.Except(fruits2);

foreach (var product in except)
    Console.WriteLine(product.Name + " " + product.Code);

/*
  This code produces the following output:

  orange 4
  lemon 12
*/

Comentários

Esse método é implementado usando a execução adiada. O valor retornado imediato é um objeto que armazena todas as informações necessárias para executar a ação. A consulta representada por esse método não é executada até que o objeto seja enumerado chamando seu GetEnumerator método diretamente ou usando foreach em C# ou For Each no Visual Basic.

O comparador de igualdade padrão, Default, é usado para comparar valores dos tipos. Para comparar um tipo de dados personalizado, você precisa substituir os EqualsGetHashCode métodos e e, opcionalmente, implementar a IEquatable<T> interface genérica no tipo personalizado. Para obter mais informações, consulte a propriedade Default.

Aplica-se a

.NET 9 e outras versões
Produto Versões
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0

Except<TSource>(IEnumerable<TSource>, IEnumerable<TSource>, IEqualityComparer<TSource>)

Origem:
Except.cs
Origem:
Except.cs
Origem:
Except.cs

Produz a diferença de conjunto de duas sequências usando o IEqualityComparer<T> especificado para comparar os valores.

C#
public static System.Collections.Generic.IEnumerable<TSource> Except<TSource> (this System.Collections.Generic.IEnumerable<TSource> first, System.Collections.Generic.IEnumerable<TSource> second, System.Collections.Generic.IEqualityComparer<TSource> comparer);
C#
public static System.Collections.Generic.IEnumerable<TSource> Except<TSource> (this System.Collections.Generic.IEnumerable<TSource> first, System.Collections.Generic.IEnumerable<TSource> second, System.Collections.Generic.IEqualityComparer<TSource>? comparer);

Parâmetros de tipo

TSource

O tipo dos elementos das sequências de entrada.

Parâmetros

first
IEnumerable<TSource>

Um IEnumerable<T> cujos elementos que não estão presentes também no second serão retornados.

second
IEnumerable<TSource>

Um IEnumerable<T> cujos elementos que também ocorrem na primeira sequência farão com que esses elementos sejam removidos da sequência retornada.

comparer
IEqualityComparer<TSource>

Um IEqualityComparer<T> para comparar valores.

Retornos

IEnumerable<TSource>

Uma sequência que contém a diferença de conjunto dos elementos das duas sequências.

Exceções

first ou second é null.

Exemplos

Se você quiser comparar sequências de objetos de algum tipo de dados personalizado, será necessário implementar a IEqualityComparer<T> interface genérica em uma classe auxiliar. O exemplo de código a seguir mostra como implementar essa interface em um tipo de dados personalizado e fornecer GetHashCode métodos e Equals . O exemplo a seguir mostra como implementar um comparador de igualdade que pode ser usado no Except método .

C#
public class Product
{
    public string Name { get; set; }
    public int Code { get; set; }
}

// Custom comparer for the Product class
class ProductComparer : IEqualityComparer<Product>
{
    // Products are equal if their names and product numbers are equal.
    public bool Equals(Product x, Product y)
    {

        //Check whether the compared objects reference the same data.
        if (Object.ReferenceEquals(x, y)) return true;

        //Check whether any of the compared objects is null.
        if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
            return false;

        //Check whether the products' properties are equal.
        return x.Code == y.Code && x.Name == y.Name;
    }

    // If Equals() returns true for a pair of objects
    // then GetHashCode() must return the same value for these objects.

    public int GetHashCode(Product product)
    {
        //Check whether the object is null
        if (Object.ReferenceEquals(product, null)) return 0;

        //Get hash code for the Name field if it is not null.
        int hashProductName = product.Name == null ? 0 : product.Name.GetHashCode();

        //Get hash code for the Code field.
        int hashProductCode = product.Code.GetHashCode();

        //Calculate the hash code for the product.
        return hashProductName ^ hashProductCode;
    }
}

Depois de implementar esse comparador, você pode usar sequências de Product objetos no Except método , conforme mostrado no exemplo a seguir:

C#
Product[] fruits1 = { new Product { Name = "apple", Code = 9 },
                       new Product { Name = "orange", Code = 4 },
                        new Product { Name = "lemon", Code = 12 } };

Product[] fruits2 = { new Product { Name = "apple", Code = 9 } };

// Get all the elements from the first array
// except for the elements from the second array.

IEnumerable<Product> except =
    fruits1.Except(fruits2, new ProductComparer());

foreach (var product in except)
    Console.WriteLine(product.Name + " " + product.Code);

/*
  This code produces the following output:

  orange 4
  lemon 12
*/

Comentários

Se comparer for null, o comparador de igualdade padrão, Default, será usado para comparar valores.

Aplica-se a

.NET 9 e outras versões
Produto Versões
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0