C# Language tranne


Esempio

Il metodo Except restituisce l'insieme di elementi contenuti nella prima raccolta ma non contenuti nella seconda. Il valore predefinito di IEqualityComparer viene utilizzato per confrontare gli elementi all'interno dei due set. C'è un sovraccarico che accetta un IEqualityComparer come argomento.

Esempio:

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

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

Produzione:

1
4

Live Demo su .NET Fiddle

In questo caso. .Except(second) esclude gli elementi contenuti nell'array second , ovvero 2 e 3 (0 e 5 non sono contenuti nel first array e vengono saltati).

Nota che Except implica Distinct (cioè rimuove gli elementi ripetuti). Per esempio:

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

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

Produzione:

1
4

Live Demo su .NET Fiddle

In questo caso, gli elementi 1 e 4 vengono restituiti una sola volta.


Implementando IEquatable o fornendo la funzione a IEqualityComparer consentirà di utilizzare un metodo diverso per confrontare gli elementi. Si noti che il metodo GetHashCode deve essere sovrascritto in modo che restituisca un codice hash identico per l' object identico in base all'implementazione IEquatable .

Esempio con 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));
    }
}

Produzione:

Hanukkah

Live Demo su .NET Fiddle