.NET Framework Class Library
EnumerableUnionTSource Method (IEnumerableTSource, IEnumerableTSource)

Produces the set union of two sequences by using the default equality comparer.

Namespace:   System.Linq
Assemblies:   System.Linq (in System.Linq.dll)
  System.Core (in System.Core.dll)
<[%$TOPIC/bb341731_en-us_VS_110_1_0_0_0_0%]> _
Public Shared Function Union(Of TSource) ( _
	first As [%$TOPIC/bb341731_en-us_VS_110_1_0_0_0_1%](Of TSource), _
	second As [%$TOPIC/bb341731_en-us_VS_110_1_0_0_0_2%](Of TSource) _
) As [%$TOPIC/bb341731_en-us_VS_110_1_0_0_0_3%](Of TSource)
public static [%$TOPIC/bb341731_en-us_VS_110_1_0_1_0_0%]<TSource> Union<TSource>(
	this [%$TOPIC/bb341731_en-us_VS_110_1_0_1_0_1%]<TSource> first,
	[%$TOPIC/bb341731_en-us_VS_110_1_0_1_0_2%]<TSource> second
generic<typename TSource>
static [%$TOPIC/bb341731_en-us_VS_110_1_0_2_0_1%]<TSource>^ Union(
	[%$TOPIC/bb341731_en-us_VS_110_1_0_2_0_2%]<TSource>^ first, 
	[%$TOPIC/bb341731_en-us_VS_110_1_0_2_0_3%]<TSource>^ second
static member Union : 
        first:[%$TOPIC/bb341731_en-us_VS_110_1_0_3_0_0%]<'TSource> * 
        second:[%$TOPIC/bb341731_en-us_VS_110_1_0_3_0_1%]<'TSource> -> [%$TOPIC/bb341731_en-us_VS_110_1_0_3_0_2%]<'TSource> 
JScript does not support generic types or methods.

Type Parameters


The type of the elements of the input sequences.


Type: System.Collections.GenericIEnumerableTSource

An IEnumerableT whose distinct elements form the first set for the union.

Type: System.Collections.GenericIEnumerableTSource

An IEnumerableT whose distinct elements form the second set for the union.

Return Value

Type: System.Collections.GenericIEnumerableTSource
An IEnumerableT that contains the elements from both input sequences, excluding duplicates.

Usage Note

In Visual Basic and C#, you can call this method as an instance method on any object of type IEnumerableTSource. When you use instance method syntax to call this method, omit the first parameter. For more information, see Extension Methods (Visual Basic) or Extension Methods (C# Programming Guide).

first or second is .


This method is implemented by using deferred execution. The immediate return value is an object that stores all the information that is required to perform the action. The query represented by this method is not executed until the object is enumerated either by calling its GetEnumerator method directly or by using foreach in Visual C# or For Each in Visual Basic.

This method excludes duplicates from the return set. This is different behavior to the ConcatTSource method, which returns all the elements in the input sequences including duplicates.

The default equality comparer, Default, is used to compare values of the types that implement the IEqualityComparerT generic interface. To compare a custom data type, you need to implement this interface and provide your own GetHashCode and Equals methods for the type.

When the object returned by this method is enumerated, Union enumerates first and second in that order and yields each element that has not already been yielded.


The following code example demonstrates how to use UnionTSource(IEnumerableTSource, IEnumerableTSource) to obtain the union of two sequences of integers.

        ' Create two arrays of integer values. 
        Dim ints1() As Integer = {5, 3, 9, 7, 5, 9, 3, 7}
        Dim ints2() As Integer = {8, 3, 6, 4, 4, 9, 1, 0}

        ' Get the set union of the two arrays. 
        Dim union As IEnumerable(Of Integer) = ints1.Union(ints2)

        ' Display the resulting set's values. 
        Dim output As New System.Text.StringBuilder
        For Each num As Integer In union
            output.AppendLine(num & " ")

        ' This code produces the following output: 
        ' 5  
        ' 3  
        ' 9  
        ' 7  
        ' 8  
        ' 6  
        ' 4  
        ' 1  
        ' 0 
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

If you want to compare sequences of objects of a custom data type, you have to implement the IEqualityComparerT generic interface in a helper class. The following code example shows how to implement this interface in a custom data type and provide GetHashCode and Equals methods.

public class ProductA
    public string Name { get; set; }
    public int Code { get; set; }

public class ProductComparer : IEqualityComparer<ProductA>

    public bool Equals(ProductA x, ProductA y)
        //Check whether the objects are the same object.  
        if (Object.ReferenceEquals(x, y)) return true;

        //Check whether the products' properties are equal.  
        return x != null && y != null && x.Code.Equals(y.Code) && x.Name.Equals(y.Name);

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

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

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

After you implement this interface, you can use sequences of ProductA objects in the UnionTSource(IEnumerableTSource, IEnumerableTSource) method, as shown in the following example.

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

Dim union = store1.Union(store2)

For Each product In union
    Console.WriteLine(product.Name & " " & product.Code)

' This code produces the following output: 
' apple 9 
' orange 4 
' lemon 12 
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 } };


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

IEnumerable<ProductA> union =

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

    This code produces the following output:

    apple 9
    orange 4
    lemon 12
Version Information

.NET Framework

Supported in: 4.6, 4.5, 4, 3.5

.NET Framework Client Profile

Supported in: 4, 3.5 SP1

XNA Framework

Supported in: 3.0

.NET for Windows Phone apps

Supported in: Windows Phone 8.1, Windows Phone Silverlight 8.1, Windows Phone Silverlight 8

Portable Class Library

Supported in: Portable Class Library