Leer en inglés

Compartir a través de


Enumerable.Union Método

Definición

Genera la unión de conjunto de dos secuencias.

Sobrecargas

Union<TSource>(IEnumerable<TSource>, IEnumerable<TSource>)

Genera la unión de conjunto de dos secuencias mediante el comparador de igualdad predeterminado.

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

Genera la unión de conjunto de dos secuencias mediante un IEqualityComparer<T>especificado.

Union<TSource>(IEnumerable<TSource>, IEnumerable<TSource>)

Source:
Union.cs
Source:
Union.cs
Source:
Union.cs

Genera la unión de conjunto de dos secuencias mediante el comparador de igualdad predeterminado.

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

Parámetros de tipo

TSource

Tipo de los elementos de las secuencias de entrada.

Parámetros

first
IEnumerable<TSource>

Un IEnumerable<T> cuyos elementos distintos forman el primer conjunto para la unión.

second
IEnumerable<TSource>

Un IEnumerable<T> cuyos elementos distintos forman el segundo conjunto para la unión.

Devoluciones

IEnumerable<TSource>

Un IEnumerable<T> que contiene los elementos de ambas secuencias de entrada, excepto los duplicados.

Excepciones

first o second es null.

Ejemplos

En el ejemplo de código siguiente se muestra cómo usar Union<TSource>(IEnumerable<TSource>, IEnumerable<TSource>) para obtener la unión de dos secuencias de enteros.

C#
int[] ints1 = { 5, 3, 9, 7, 5, 9, 3, 7 };
int[] ints2 = { 8, 3, 6, 4, 4, 9, 1, 0 };

IEnumerable<int> union = ints1.Union(ints2);

foreach (int num in union)
{
    Console.Write("{0} ", num);
}

/*
 This code produces the following output:

 5 3 9 7 8 6 4 1 0
*/

Si desea comparar secuencias de objetos de algún tipo de datos personalizado, debe implementar la interfaz genérica IEquatable<T> en una clase auxiliar. En el ejemplo de código siguiente se muestra cómo implementar esta interfaz en un tipo de datos personalizado e invalidar los métodos GetHashCode y 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();
}

Después de implementar esta interfaz, puede usar secuencias de objetos ProductA en el método Union<TSource>(IEnumerable<TSource>, IEnumerable<TSource>), como se muestra en el ejemplo siguiente:

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

ProductA[] store2 = { new ProductA { Name = "apple", Code = 9 },
                       new ProductA { Name = "lemon", Code = 12 } };
C#
//Get the products from the both arrays
//excluding duplicates.

IEnumerable<ProductA> union =
  store1.Union(store2);

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

/*
    This code produces the following output:

    apple 9
    orange 4
    lemon 12
*/

Comentarios

Este método se implementa mediante la ejecución diferida. El valor devuelto inmediato es un objeto que almacena toda la información necesaria para realizar la acción. La consulta representada por este método no se ejecuta hasta que el objeto se enumera llamando directamente a su método GetEnumerator o mediante foreach en C# o For Each en Visual Basic.

Este método excluye los duplicados del conjunto de retorno. Este comportamiento es diferente al método Concat, que devuelve todos los elementos de las secuencias de entrada, incluidos los duplicados.

El comparador de igualdad predeterminado, Default, se usa para comparar valores de los tipos que implementan la interfaz genérica de IEqualityComparer<T>. Para comparar un tipo de datos personalizado, debe implementar esta interfaz y proporcionar sus propios métodos de GetHashCode y Equals para el tipo.

Cuando se enumera el objeto devuelto por este método, Union enumera first y second en ese orden y produce cada elemento que aún no se ha producido.

Se aplica a

.NET 9 y otras versiones
Producto Versiones
.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

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

Source:
Union.cs
Source:
Union.cs
Source:
Union.cs

Genera la unión de conjunto de dos secuencias mediante un IEqualityComparer<T>especificado.

C#
public static System.Collections.Generic.IEnumerable<TSource> Union<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> Union<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

Tipo de los elementos de las secuencias de entrada.

Parámetros

first
IEnumerable<TSource>

Un IEnumerable<T> cuyos elementos distintos forman el primer conjunto para la unión.

second
IEnumerable<TSource>

Un IEnumerable<T> cuyos elementos distintos forman el segundo conjunto para la unión.

comparer
IEqualityComparer<TSource>

El IEqualityComparer<T> para comparar valores.

Devoluciones

IEnumerable<TSource>

Un IEnumerable<T> que contiene los elementos de ambas secuencias de entrada, excepto los duplicados.

Excepciones

first o second es null.

Ejemplos

En el ejemplo siguiente se muestra cómo implementar un comparador de igualdad que se puede usar en el método Union.

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;
    }
}

Después de implementar este comparador, puede usar secuencias de objetos Product en el método Union, como se muestra en el ejemplo siguiente:

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

Product[] store20 = { new Product { Name = "apple", Code = 9 },
                       new Product { Name = "lemon", Code = 12 } };

//Get the products from the both arrays
//excluding duplicates.

IEnumerable<Product> union =
  store10.Union(store20, new ProductComparer());

foreach (Product product in union)
    Console.WriteLine(product.Name + " " + product.Code);

/*
    This code produces the following output:

    apple 9
    orange 4
    lemon 12
*/

Comentarios

Este método se implementa mediante la ejecución diferida. El valor devuelto inmediato es un objeto que almacena toda la información necesaria para realizar la acción. La consulta representada por este método no se ejecuta hasta que el objeto se enumera llamando directamente a su método GetEnumerator o mediante foreach en C# o For Each en Visual Basic.

Si comparer es null, el comparador de igualdad predeterminado, Default, se usa para comparar valores.

Cuando se enumera el objeto devuelto por este método, Union enumera first y second en ese orden y produce cada elemento que aún no se ha producido.

El método Concat difiere del método Union porque el método Concat devuelve todos los elementos de las secuencias de entrada, incluidos los duplicados, mientras que Union devuelve solo valores únicos.

Consulte también

Se aplica a

.NET 9 y otras versiones
Producto Versiones
.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