Прочитать на английском

Поделиться через


Enumerable.Union Метод

Определение

Создает объединение наборов двух последовательностей.

Перегрузки

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

Создает объединение наборов двух последовательностей с помощью средства сравнения равенства по умолчанию.

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

Создает объединение наборов двух последовательностей с помощью указанного IEqualityComparer<T>.

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

Исходный код:
Union.cs
Исходный код:
Union.cs
Исходный код:
Union.cs

Создает объединение наборов двух последовательностей с помощью средства сравнения равенства по умолчанию.

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

Параметры типа

TSource

Тип элементов входных последовательностей.

Параметры

first
IEnumerable<TSource>

IEnumerable<T>, отдельные элементы которого образуют первый набор для объединения.

second
IEnumerable<TSource>

IEnumerable<T>, отдельные элементы которого образуют второй набор для объединения.

Возвращаемое значение

IEnumerable<TSource>

IEnumerable<T>, содержащий элементы из обеих входных последовательностей, за исключением дубликатов.

Исключения

first или secondnull.

Примеры

В следующем примере кода показано, как использовать Union<TSource>(IEnumerable<TSource>, IEnumerable<TSource>) для получения объединения двух последовательностей целых чисел.

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
*/

Если требуется сравнить последовательности объектов определенного пользовательского типа данных, необходимо реализовать IEquatable<T> универсальный интерфейс в вспомогательном классе. В следующем примере кода показано, как реализовать этот интерфейс в пользовательском типе данных и переопределить GetHashCode и методы 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();
}

После реализации этого интерфейса можно использовать последовательности объектов ProductA в методе Union<TSource>(IEnumerable<TSource>, IEnumerable<TSource>), как показано в следующем примере:

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
*/

Комментарии

Этот метод реализуется с помощью отложенного выполнения. Немедленное возвращаемое значение — это объект, в который хранятся все сведения, необходимые для выполнения действия. Запрос, представленный этим методом, не выполняется, пока объект не перечисляется путем вызова метода GetEnumerator напрямую или с помощью foreach в C# или For Each в Visual Basic.

Этот метод исключает дубликаты из возвращаемого набора. Это отличается от метода Concat, который возвращает все элементы входных последовательностей, включая повторяющиеся.

Сравнение равенства по умолчанию Defaultиспользуется для сравнения значений типов, реализующих универсальный интерфейс IEqualityComparer<T>. Чтобы сравнить настраиваемый тип данных, необходимо реализовать этот интерфейс и предоставить собственные GetHashCode и Equals методы для этого типа.

При перечислении объекта, возвращаемого этим методом, Union перечисляет first и second в этом порядке и выдает каждый элемент, который еще не был получен.

Применяется к

.NET 9 и другие версии
Продукт Версии
.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>)

Исходный код:
Union.cs
Исходный код:
Union.cs
Исходный код:
Union.cs

Создает объединение наборов двух последовательностей с помощью указанного IEqualityComparer<T>.

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

Параметры типа

TSource

Тип элементов входных последовательностей.

Параметры

first
IEnumerable<TSource>

IEnumerable<T>, отдельные элементы которого образуют первый набор для объединения.

second
IEnumerable<TSource>

IEnumerable<T>, отдельные элементы которого образуют второй набор для объединения.

comparer
IEqualityComparer<TSource>

IEqualityComparer<T> для сравнения значений.

Возвращаемое значение

IEnumerable<TSource>

IEnumerable<T>, содержащий элементы из обеих входных последовательностей, за исключением дубликатов.

Исключения

first или secondnull.

Примеры

В следующем примере показано, как реализовать средство сравнения равенства, которое можно использовать в методе 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;
    }
}

После реализации этого средства сравнения можно использовать последовательности объектов Product в методе Union, как показано в следующем примере:

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
*/

Комментарии

Этот метод реализуется с помощью отложенного выполнения. Немедленное возвращаемое значение — это объект, в который хранятся все сведения, необходимые для выполнения действия. Запрос, представленный этим методом, не выполняется, пока объект не перечисляется путем вызова метода GetEnumerator напрямую или с помощью foreach в C# или For Each в Visual Basic.

Если comparernull, для сравнения значений используется средство сравнения равенства по умолчанию Default.

При перечислении объекта, возвращаемого этим методом, Union перечисляет first и second в этом порядке и выдает каждый элемент, который еще не был получен.

Метод Concat отличается от метода Union, так как метод Concat возвращает все элементы входных последовательностей, включая повторяющиеся, в то время как Union возвращает только уникальные значения.

См. также раздел

  • метода UnionBy

Применяется к

.NET 9 и другие версии
Продукт Версии
.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