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

Оператор пересечения наборов LINQ Intersect

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

Пример: использование метода Intersect в синтаксисе метода C#
IList<string> strList1 = new List<string>() { "One", "Two", "Three", "Four", "Five" };
IList<string> strList2 = new List<string>() { "Four", "Five", "Six", "Seven", "Eight"};
var result = strList1.Intersect(strList2);
foreach (string str in result)
        Console.WriteLine(str);
Вывод:
Four
Five

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

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

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

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

Пример: Оператор Intersect в 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.Intersect(studentList2, new StudentComparer()); 
foreach(Student std in resultedCol)
    Console.WriteLine(std.StudentName);
Вывод:
Bill
Ron