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

Оператор объединения LINQ Set

Метод расширения Union требует двух集合 и возвращает новый набор, содержащий уникальные элементы из обоих наборов. См. следующий пример.

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);
Вывод:
One
Two
three
THREE
Four
Five

Метод расширения Union не может возвращать правильные результаты для сложных типов集合. Вам нужно реализовать интерфейс IEqualityComparer, чтобы получить правильные результаты из метода Union.

Реализуйте интерфейс IEqualityComparer для класса Student, как показано ниже:

Пример: использование оператора союза 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();
    }
}

Теперь вы можете передать класс StudentComparer в метод Union расширения, чтобы получить правильный результат:

Пример: Оператор объединения - 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);
Вывод:
John
Steve
Bill
Ron

Синтаксис запроса

Синтаксис запросов C # & VB.Net не поддерживает операторы объединения. Однако, вы можете использовать метод Union для переменных запроса или 包装 весь запрос в квадратные скобки и вызвать Union().