English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Метод 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, как показано ниже:
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 ().