The Except method returns the set of items which are contained in the first collection but are not contained in the second. The default [IEqualityComparer](<https://msdn.microsoft.com/en-us/library/ms132151(v=vs.110).aspx>) is used to compare the items within the two sets. There is an overload which accepts an [IEqualityComparer](<https://msdn.microsoft.com/en-us/library/ms132151(v=vs.110).aspx>) as an argument.

Example:

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

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

Output:

1 4

Live Demo on .NET Fiddle

In this case .Except(second) excludes elements contained in the array second, namely 2 and 3 (0 and 5 are not contained in the first array and are skipped).

Note that Except implies Distinct (i.e., it removes repeated elements). For example:

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

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

Output:

1 4

Live Demo on .NET Fiddle

In this case, the elements 1 and 4 are returned only once.

Implementing [IEquatable](<https://msdn.microsoft.com/en-us/library/ms131187(v=vs.110).aspx>) or providing the function an [IEqualityComparer](<https://msdn.microsoft.com/en-us/library/ms132151(v=vs.110).aspx>) will allow using a different method to compare the elements. Note that the [GetHashCode](<https://msdn.microsoft.com/en-us/library/system.object.gethashcode(v=vs.110).aspx>) method should also be overridden so that it will return an identical hash code for object that are identical according to the [IEquatable](<https://msdn.microsoft.com/en-us/library/ms131187(v=vs.110).aspx>) implementation.

Example With 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));
    }
}

Output:

Hanukkah

Live Demo on .NET Fiddle