C# Language Sauf


Exemple

La méthode Except renvoie l'ensemble des éléments contenus dans la première collection mais ne sont pas contenus dans la seconde. IEqualityComparer par défaut est utilisé pour comparer les éléments dans les deux ensembles. Il y a une surcharge qui accepte un IEqualityComparer comme argument.

Exemple:

int[] first = { 1, 2, 3, 4 };
int[] second = { 0, 2, 3, 5 };

IEnumerable<int> inFirstButNotInSecond = first.Except(second);
// inFirstButNotInSecond = { 1, 4 }

Sortie:

1
4

Démo en direct sur .NET Fiddle

Dans ce cas, .Except(second) exclut les éléments contenus dans le tableau second , à savoir 2 et 3 (0 et 5 ne sont pas contenus dans le first tableau et sont ignorés).

Notez que Except implique Distinct (c.-à-d. Qu'il supprime les éléments répétés). Par exemple:

int[] third = { 1, 1, 1, 2, 3, 4 };

IEnumerable<int> inThirdButNotInSecond = third.Except(second);
// inThirdButNotInSecond = { 1, 4 }

Sortie:

1
4

Démo en direct sur .NET Fiddle

Dans ce cas, les éléments 1 et 4 ne sont renvoyés qu’une seule fois.


Implémenter IEquatable ou fournir la fonction IEqualityComparer permettra d'utiliser une méthode différente pour comparer les éléments. Notez que la méthode GetHashCode doit également être remplacée afin de renvoyer un code de hachage identique pour un object identique selon l'implémentation IEquatable .

Exemple avec IEquatable:

class Holiday : IEquatable<Holiday>
{
    public string Name { get; set; }

    public bool Equals(Holiday other)
    {
        return Name == other.Name;
    }

    // GetHashCode must return true whenever Equals returns true.
    public override int GetHashCode()
    {
        //Get hash code for the Name field if it is not null.
        return Name?.GetHashCode() ?? 0;
    }
}

public class Program
{
    public static void Main()
    {
        List<Holiday> holidayDifference = new List<Holiday>();

        List<Holiday> remoteHolidays = new List<Holiday>
        {
            new Holiday { Name = "Xmas" },
            new Holiday { Name = "Hanukkah" },
            new Holiday { Name = "Ramadan" }
        };

        List<Holiday> localHolidays = new List<Holiday>
        {
            new Holiday { Name = "Xmas" },
            new Holiday { Name = "Ramadan" }
        };

        holidayDifference = remoteHolidays
            .Except(localHolidays)
            .ToList();

        holidayDifference.ForEach(x => Console.WriteLine(x.Name));
    }
}

Sortie:

Hanoukka

Démo en direct sur .NET Fiddle