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

Opérateur Set Except en LINQ

La méthode Except() nécessite deux ensembles. Elle renvoie un nouvel ensemble contenant les éléments de la première collection qui ne se trouvent pas dans la deuxième collection (paramètre de la collection).

IList<string> strList1 = new List<string>(){"Un", "Deux", "Trois", "Quatre", "Cinq"};
IList<string> strList2 = new List<string>(){"Quatre", "Cinq", "Six", "Sept", "Huit"};
var result = strList1.Except(strList2);
foreach (string str in result)
        Console.WriteLine(str);
Sortie :
Un
Deux
Trois

L'extension method Except ne renvoie pas les résultats corrects pour les collections de types complexes. Vous devez implémenter l'interface IEqualityComparer pour obtenir les résultats corrects de la méthode Except.

Pour implémenter l'interface IEqualityComparer pour la classe Student, voici comment il faut procéder :

Exemple : Utilisation de la méthode Except dans 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)
    {
        si (x.StudentID == y.StudentID et x.StudentName.ToLower() == y.StudentName.ToLower())
            return true;
        return false;
    }
    public int GetHashCode(Student obj)
    {
        return obj.StudentID.GetHashCode();
    }
}

Maintenant, vous pouvez obtenir le bon résultat à travers l'extension method Except en utilisant la classe StudentComparer :

Exemple : méthode Except() du type d'objet 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);
Sortie :
John
Steve

La syntaxe de requête C # & VB.Net ne prend pas en charge l'opérateur Except. Cependant, vous pouvez utiliser la méthode Distinct pour la variable de requête ou envelopper toute la requête dans des parenthèses, puis appeler Except ().