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

Оператор Set运算атор Except LINQ

Метод Except требует двух集合. Он возвращает новый набор, который содержит элементы из первого набора, которые отсутствуют во втором наборе (параметрическом наборе).

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.Except(strList2);
foreach (string str in result)
        Console.WriteLine(str);
Вывод:
One
Two
Three

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

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

Пример: Использование метода Except в C#
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 в расширяемом методе Except():

Пример: метод Except() для типа объекта 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.Except(studentList2, new StudentComparer()); 
foreach(Student std in resultedCol)
    Console.WriteLine(std.StudentName);
Вывод:
John
Steve

Оператор Except не поддерживается в грамматике запросов C# & VB.Net. Однако, вы можете использовать метод Distinct для переменной запроса или包裹 весь запрос в скобки и вызвать Except ().