📜  LINQ |设置运算符|除了(1)

📅  最后修改于: 2023-12-03 15:02:41.532000             🧑  作者: Mango

LINQ 操作符:除了(Except)

LINQ(Language Integrated Query,语言集成查询)提供了许多操作符,其中之一是“除了(Except)”操作符。本文将介绍如何使用“除了”操作符,并提供一些示例代码。

语法

“除了”操作符用于从第一个集合中删除在第二个集合中出现的所有元素。以下是“除了”操作符的语法:

public static IEnumerable<TSource> Except<TSource> (this IEnumerable<TSource> first, IEnumerable<TSource> second);

其中,第一个参数是要从中排除元素的集合,第二个参数是要排除的集合。

示例

假设我们有两个整数集合:

int[] numbers1 = { 1, 2, 3, 4, 5 };
int[] numbers2 = { 3, 4, 5, 6, 7 };

我们想从第一个集合中排除在第二个集合中出现的元素。我们可以使用“除了”操作符来完成此操作:

var result = numbers1.Except(numbers2);

结果将是一个包含1和2的新集合。

自定义比较器

默认情况下,“除了”操作符检查集合中的元素是否相等。但是,您可以提供自定义比较器,以便更精确地控制元素匹配的方式。以下是一个示例,其中使用自定义比较器来比较Person对象:

public class Person {
    public string Name { get; set; }
    public int Age { get; set; }
}

public class PersonComparer : IEqualityComparer<Person> {
    public bool Equals(Person x, Person y) {
        return x.Name == y.Name && x.Age == y.Age;
    }

    public int GetHashCode(Person obj) {
        return obj.Name.GetHashCode() ^ obj.Age.GetHashCode();
    }
}

Person[] people1 = {
    new Person { Name = "Alice", Age = 18 },
    new Person { Name = "Bob", Age = 22 },
    new Person { Name = "Charlie", Age = 30 }
};

Person[] people2 = {
    new Person { Name = "Charlie", Age = 30 },
    new Person { Name = "Dave", Age = 40 }
};

var result = people1.Except(people2, new PersonComparer());

在上面的示例中,我们创建了一个自定义比较器PersonComparer,并将其传递给“除了”操作符。这将导致Person对象的Name和Age属性被用于比较两个集合中的元素。

总结

“除了”操作符用于从第一个集合中删除在第二个集合中出现的所有元素。您可以使用默认比较器或提供自定义比较器来控制元素匹配的方式。