C# Language Excepto


Ejemplo

El método Except devuelve el conjunto de elementos que están contenidos en la primera colección, pero no están contenidos en la segunda. El IEqualityComparer predeterminado se utiliza para comparar los elementos dentro de los dos conjuntos. Hay una sobrecarga que acepta un IEqualityComparer como argumento.

Ejemplo:

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

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

Salida:

1
4

Demo en vivo en .NET Fiddle

En este caso. .Except(second) excluye los elementos contenidos en la matriz second , es decir, 2 y 3 (0 y 5 no están contenidos en la first matriz y se omiten).

Tenga en cuenta que Except implica Distinct (es decir, elimina elementos repetidos). Por ejemplo:

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

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

Salida:

1
4

Demo en vivo en .NET Fiddle

En este caso, los elementos 1 y 4 se devuelven solo una vez.


Implementar IEquatable o proporcionar la función un IEqualityComparer permitirá usar un método diferente para comparar los elementos. Tenga en cuenta que el método GetHashCode también debe anularse para que devuelva un código hash idéntico para el object que sea idéntico según la implementación de IEquatable .

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

Salida:

Hanukkah

Demo en vivo en .NET Fiddle