English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

LINQ Set Operator Union

The Union extension method requires two collections and returns a new collection containing different elements from both collections. See the following example.

IList<string> strList1 = new List<string>() { "One", "Two", "three", "Four" };
IList<string> strList2 = new List<string>() { "Two", "THREE", "Four", "Five" };
var result = strList1.Union(strList2);
foreach (string str in result)
        Console.WriteLine(str);
Output:
One
Two
three
THREE
Four
Five

The Union extension method cannot return correct results for complex type collections. You need to implement the IEqualityComparer interface to get the correct results from the Union method.

Implement the IEqualityComparer interface for the Student class as follows:

Example: Using the Union operator of IEqualityComparer:
public class Student 
{
    public int StudentID { get; set; }
    public string StudentName { get; set; }
    public int Age { get; set; }
}
class StudentComparer : IEqualityComparer<Student>
{
    public bool Equals(Student x, Student y)
    {
        if (x.StudentID == y.StudentID && x.StudentName.ToLower() == y.StudentName.ToLower())
            return true;
        return false;
    }
    public int GetHashCode(Student obj)
    {
        return obj.StudentID.GetHashCode();
    }
}

Now, you can pass the above StudentComparer class to the Union extension method to get the correct result:

Example: Union Operator - C#

IList<Student> studentList1 = new List<Student>() { 
        new Student() { StudentID = 1, StudentName = "John", Age = 18 },
        new Student() { StudentID = 2, StudentName = "Steve", Age = 15 },
        new Student() { StudentID = 3, StudentName = "Bill", Age = 25 },
        new Student() { StudentID = 5, StudentName = "Ron", Age = 19 } 
    };
IList<Student> studentList2 = new List<Student>() { 
        new Student() { StudentID = 3, StudentName = "Bill", Age = 25 },
        new Student() { StudentID = 5, StudentName = "Ron", Age = 19 } 
    };
var resultedCol = studentList1.Union(studentList2, new StudentComparer()); 
foreach(Student std in resultedCol)
    Console.WriteLine(std.StudentName);
Output:
John
Steve
Bill
Ron

Query Syntax

C# & VB.Net query syntax does not support union operators. However, you can use the Union method for query variables, or wrap the entire query in brackets and then call Union().