除了

Except 方法返回第一個集合中包含但未包含在第二個集合中的項集。預設 IEqualityComparer 用於比較兩組中的專案。有一個過載接受 IEqualityComparer 作為引數。

例:

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

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

輸出:

1
4

.NET 小提琴現場演示

在這種情況下,.Except(second) 排除了陣列 second 中包含的元素,即 2 和 3(0 和 5 不包含在 first 陣列中並被跳過)。

請注意,Except 意味著 Distinct(即,它刪除重複的元素)。例如:

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

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

輸出:

1
4

.NET 小提琴現場演示

在這種情況下,元素 1 和 4 僅返回一次。

實施 IEquatable 或提供的功能的 IEqualityComparer 將允許使用不同的方法的元素進行比較。請注意,還應該重寫 GetHashCode 方法,以便根據 IEquatable 實現為 object 返回相同的雜湊碼。

使用 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));
    }
}

輸出:

光明節

.NET 小提琴現場演示