CS5L13-2——求两个数据集合的交集

本章代码关键字

1
IEnumerable<>.Intersect()        //传入另一个集合,返回该集合和传入的集合的交集

交集

假设有两个数组,求两个数组的交集

1
2
3
//假设有两个数组,求两个数组的交集
int[] arr1 = new int[] { 1, 2, 3, 4, 5, 6 };
int[] arr2 = new int[] { 4, 5, 6, 7, 8, 9 };

不使用LINQ

1
2
3
4
5
6
7
8
9
10
private static void Normal2(int[] arr1, int[] arr2)
{
Console.WriteLine("不使用LINQ");
var result = new List<int>();
foreach (var i in arr1)
if (arr2.Contains(i))
result.Add(i);
foreach (var i in result)
Console.WriteLine(i);
}

输出结果:

1
2
3
4
5
6

获取一个集合和另一个集合交集

这个方法只有链式表达式有,返回arr1​ 和 arr2​ 的交集

1
var result = arr1.Intersect(arr2);

LINQ实例

使用LINQ链式表达式

1
2
3
4
5
6
7
private static void ChainedExpressionLINQ2(int[] arr1, int[] arr2)
{
Console.WriteLine("链式表达式LINQ");
var result = arr1.Intersect(arr2);
foreach (var i in result)
Console.WriteLine(i);
}

输出结果:

1
2
3
4
5
6

如果你愿意在IDE内将鼠标指向方法,你可以看到,这个Intersect()​其实就是一种拓展方法,求两个可迭代类型集合IEnumerable<>​的交集

image

需要注意的是,不是所有的链式表达式的方法都可以在查询表达式里找到对应关键字
因为查询表达式的语法基本就是SQL语句那些关键字,
例如 orderby​、select​、join​、groupby​ 等,这些关键字以外的内容可能就没那么好用了

但是也这不代表不能用查询表达式

1
2
3
4
5
6
7
8
9
private static void QueryExpressionLINQ2(int[] arr1, int[] arr2)
{
Console.WriteLine("查询表达式LINQ");
var result = from n in arr1
where arr2.Contains(n) //但有一说一,你说这玩意不就和一般方法的原理一样吗
select n;
foreach (var i in result)
Console.WriteLine(i);
}

输出结果:

1
2
3
4
5
6