C# Linq的Except()方法 – 返回在一个序列中但不在另一个序列中的元素

  • Post category:C#

下面是关于C# Linq中Except()方法的详细攻略:

1. Except()方法概述

Except()是C# Linq中的一个拓展方法,用来求两个集合的差集。它返回的结果是一个集合,包含第一个集合中不包含在第二个集合中的元素。该方法的语法为:

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

其中,参数first和second分别表示要进行差集操作的两个集合。除此之外,我们还可以指定一个可选的IEqualityComparer接口类型的参数,用来指定元素比较的方法。

2. Except()方法示例

下面通过两个具体的例子,来进一步说明Except()方法的使用。

2.1 示例1:求两个数组的差集

我们先定义两个整数类型的数组a和b,并初始化它们:

int[] a = { 1, 2, 3, 4, 5 };
int[] b = { 4, 5, 6, 7, 8 };

现在,我们可以直接使用Except()方法来求a和b的差集:

var result = a.Except(b);

执行上述代码后,result的值将是一个整数类型的集合,包含了a中不包含在b中的元素,即:{1, 2, 3}。

2.2 示例2:指定元素比较器

下面,我们来看一个更为复杂的例子。假设我们有一个字符串类型的集合words,里面包含了一些单词。现在,我们要求出这个集合中去掉所有前缀为”pre-“的单词之后,不重复的单词有多少个。注意,这里不区分大小写。

首先,我们需要定义一个元素比较器。由于我们要不区分大小写地比较字符串,因此可以使用StringComparer类的IgnoreCase选项来创建一个忽略大小写的比较器:

var comparer = StringComparer.OrdinalIgnoreCase;

接下来,我们来创建words集合,并初始化它的元素:

string[] words = { "PREtext", "something", "pretext", "another", "pre-position", "else" };

现在,我们可以使用Linq语句来对words进行过滤和去重:

var result = words
                .Where(w => !w.StartsWith("pre-", StringComparison.OrdinalIgnoreCase))   // 过滤掉前缀为"pre-"的单词
                .Select(w => w.ToLower())   // 转换为小写字母
                .Distinct(comparer);    // 去重,不区分大小写

最后,我们来统计一下result中的元素个数即可:

int count = result.Count();

执行上述代码后,count的值将是2,即去掉前缀为”pre-“后,不重复的单词个数有2个。

这样,以上就是关于C# Linq Except()方法的完整攻略了。