除了

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 小提琴现场演示