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

Opérateurs de Set Distinct dans LINQ

Le tableau suivant liste tous les opérateurs de Set disponibles dans LINQ.

Opérateurs de collectionUtilisation
Distinct

Retourne les valeurs non répétées de l'ensemble.

Except

Retourne la différence entre les deux séquences, ce qui signifie que les éléments d'un ensemble ne sont pas présents dans le deuxième ensemble.

Intersect

Retourne l'intersection des deux séquences, c'est-à-dire les éléments apparaissant dans les deux ensembles.

Union

Retourne les éléments uniques des deux séquences, ce qui signifie les éléments uniques apparaissant dans les deux séquences.

Distinct

L'extension de méthode Distinct retourne un nouveau ensemble d'éléments uniques à partir de l'ensemble donné.

IList<string> strList = new List<string>(){ "Un", "Deux", "Trois", "Deux", "Trois" };
IList<int> intList = new List<int>(){ 1, 2, 3, 2, 4, 4, 3, 5 };
var distinctList1 = strList.Distinct();
foreach (var str in distinctList1)
    Console.WriteLine(str);
var distinctList2 = intList.Distinct();
foreach (var i in distinctList2)
    Console.WriteLine(i);
Sortie :
Un
Deux
Trois
1
2
3
4
5

L'extension Distinct ne compare pas les valeurs des types complexes. Pour comparer les valeurs des types complexes, il est nécessaire d'implémenter l'interface IEqualityComparer<T>. Dans l'exemple suivant, la classe StudentComparer implémente IEqualityComparer<Student> pour comparer les Student objects.

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

Maintenant, vous pouvez passer l'objet de la classe StudentComparer mentionnée ci-dessus en tant que paramètre à la méthode Distinct() pour comparer les objets Student, comme suit. Exemple : Comparaison des objets avec Distinct en C#

IList<Student> studentList = 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 = 3, StudentName = "Bill", Age = 25 },
        new Student() { StudentID = 3, StudentName = "Bill", Age = 25 },
        new Student() { StudentID = 3, StudentName = "Bill", Age = 25 },
        new Student() { StudentID = 5, StudentName = "Ron" , Age = 19 } 
    };
var distinctStudents = studentList.Distinct(new StudentComparer()); 
foreach(Student std in distinctStudents)
    Console.WriteLine(std.StudentName);
Sortie :
John
Steve
Bill
Ron

Opérateur Distinct dans la syntaxe de requête

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

Utilisation du mot-clé Distinct dans la syntaxe de requête VB.Net :

Dim strList = New List(Of string) From {"One", "Three", "Two", "Two", "One"}
Dim distinctStr = From s In strList _
                  Select s Distinct