C# Linq的Intersect()方法 – 返回两个序列的交集

C# Linq Intersect()方法详解

Intersect()方法的定义

Intersect()方法是C# Linq方法之一,用于返回两个序列中共同出现的元素。该方法有两个重载版本,一个是无参数版本,返回两个序列中的重复元素,一个是带有另外一个序列作为参数的版本,返回两个序列中相同的元素。

无参数版本

无参数版本的Intersect()方法用于从两个序列中返回所有重复的元素。

Intersect()方法的基本语法如下:

Enumerable.Intersect<TSource>(IEnumerable<TSource> first, IEnumerable<TSource> second)

其中,first代表第一个序列,second代表第二个序列,TSource表示序列中的元素类型。方法返回一个IEnumerable<TSource>类型的序列,包含两个序列中的重复元素。

下面是一个无参数版本的Intersect()方法的示例:

var nums1 = new List<int> {1, 2, 3, 4};
var nums2 = new List<int> {3, 4, 5, 6};
var result = nums1.Intersect(nums2);
// 输出:3 4
foreach(var num in result)
{
    Console.Write(num + " ");
}

带参数版本

带参数版本的Intersect()方法用于从两个序列中返回相同的元素。

Intersect()方法的带参数语法如下:

Enumerable.Intersect<TSource>(IEnumerable<TSource> first, IEnumerable<TSource> second, IEqualityComparer<TSource> comparer)

其中,first代表第一个序列,second代表第二个序列,comparer是一个实现了IEqualityComparer<TSource>接口的对象,用于比较元素的相等性。方法返回一个IEnumerable<TSource>类型的序列,包含两个序列中相同的元素。

下面是一个带参数版本的Intersect()方法的示例:

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

    public override bool Equals(object obj)
    {
        if (obj is Person person)
        {
            return Id.Equals(person.Id);
        }
        return false;
    }

    public override int GetHashCode()
    {
        return Id.GetHashCode();
    }
}

var list1 = new List<Person>
{
    new Person { Id = 1, Name = "Person1" },
    new Person { Id = 2, Name = "Person2" },
    new Person { Id = 3, Name = "Person3" },
    new Person { Id = 4, Name = "Person4" },
};

var list2 = new List<Person>
{
    new Person { Id = 3, Name = "Person3" },
    new Person { Id = 4, Name = "Person4" },
    new Person { Id = 5, Name = "Person5" },
    new Person { Id = 6, Name = "Person6" },
};

var intersectList = list1.Intersect(list2, new PersonComparer());
// 输出:3 Person3 4 Person4
foreach (var item in intersectList)
{
    Console.WriteLine($"{item.Id} {item.Name}");
}

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

    public int GetHashCode(Person obj)
    {
        return obj.Id.GetHashCode();
    }
}

在这个示例中,两个列表都包含Person对象。我们自定义了一个PersonComparer类,它实现了IEqualityComparer<Person>接口,用于判断两个对象是否相等。通过带参数版本的Intersect()方法,我们将两个列表中的Person对象进行了比较,并返回了列表中相同的元素。

Intersect应用场景示例

Intersect()方法常用于在两个集合中查找并返回共同出现的元素,例如:

1.查找两个数组中相同的元素:

int[] numArray1 = { 1, 2, 3, 4, 5 };
int[] numArray2 = { 3, 4, 5, 6, 7 };
var result = numArray1.Intersect(numArray2);
foreach (var num in result)
{
    Console.WriteLine(num);
}

2.查找两个列表中相同的对象:

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

    public override bool Equals(object obj)
    {
        if (obj is Person person)
        {
            return Id.Equals(person.Id);
        }
        return false;
    }

    public override int GetHashCode()
    {
        return Id.GetHashCode();
    }
}

var list1 = new List<Person>
{
    new Person { Id = 1, Name = "Person1" },
    new Person { Id = 2, Name = "Person2" },
    new Person { Id = 3, Name = "Person3" },
    new Person { Id = 4, Name = "Person4" },
};

var list2 = new List<Person>
{
    new Person { Id = 3, Name = "Person3" },
    new Person { Id = 4, Name = "Person4" },
    new Person { Id = 5, Name = "Person5" },
    new Person { Id = 6, Name = "Person6" },
};

var intersectList = list1.Intersect(list2, new PersonComparer());
foreach (var item in intersectList)
{
    Console.WriteLine($"{item.Id} {item.Name}");
}

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

    public int GetHashCode(Person obj)
    {
        return obj.Id.GetHashCode();
    }
}

以上就是Intersect()方法的完整攻略,通过这篇介绍,我们可以清楚地了解Intersect()方法及其使用场景。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# Linq的Intersect()方法 – 返回两个序列的交集 - Python技术站

(0)
上一篇 2023年4月19日
下一篇 2023年4月19日

相关文章

  • C++实践数组类运算的实现参考

    C++实践数组类运算的实现参考 是一篇介绍如何实现C++数组类运算的实用的攻略。下面我将对该攻略进行详细解释。 1. 背景 在C++中,提供了, , 等容器,可以很方便的表示和操作数组。 为了更好的操作这些数组,我们可以自定义一个数组类,并为其实现常见的数学运算,就可以更为方便的使用。 2. 实现思路 本篇攻略引用了底层的数组称之为_base,它是一个一维的…

    C# 2023年6月8日
    00
  • C#操作进程的方法介绍

    C# 操作进程的方法介绍 C# 中可以通过 Process 类来实现对进程的操作,包括启动进程、杀死进程、查找进程等。 以下是常用的操作进程的方法: 启动进程 启动新进程可以使用 Process.Start 方法,该方法返回一个 Process 对象,通过该对象可以得到该进程的一些详细信息,比如进程 ID,句柄等。 以下示例代码演示了如何启动计算器程序: u…

    C# 2023年6月7日
    00
  • 基于Avalonia实现自定义弹窗的示例详解

    基于Avalonia实现自定义弹窗需要进行以下步骤: 引入Avalonia库 在项目文件中引入Avalonia库,可以通过NuGet包管理器或手动添加引用的方式进行。同时,需要在App.xaml文件中声明Avalonia样式资源。 自定义弹窗视图 创建名为”CustomPopup.axaml”的Avalonia视图用于定义自定义弹窗的布局和样式。在这个视图中…

    C# 2023年5月15日
    00
  • C#精确到纳秒级别的计时器类实现代码

    下面我将为您详细讲解“C#精确到纳秒级别的计时器类实现代码”的完整攻略。 1. 实现思路 在C#中,我们可以使用System.Diagnostics.StopWatch类来实现高分辨率的计时器。StopWatch能够提供极其精确的计时,其精度可达纳秒级别,而且使用非常简单。 StopWatch通过读取计算机系统时钟记录时间,并在计时暂停、重启和停止时自动计算…

    C# 2023年6月1日
    00
  • 生成代码从T到T1、T2、Tn自动生成多个类型的泛型实例代码

    生成代码从 T 到 T1、T2、Tn 可以采用泛型实现,这要求在代码的编写中加入范型的参数和返回类型,并在程序运行时通过传入的不同类型参数自动生成多个类型的泛型实例代码。 具体实现步骤如下: 在代码中声明一个泛型方法,该方法中使用泛型参数 T 作为数据类型的占位符,以代表传入参数的类型。示例代码如下: public static <T> void…

    C# 2023年6月6日
    00
  • C#实现中文验证码的示例代码

    下面就为您详细讲解”C#实现中文验证码的示例代码”的完整攻略,其中包含两个示例说明。 1. 前置知识 在实现中文验证码之前,需要先了解以下知识: C#基础编程知识 图形绘制基础 验证码的概念和生成方式 中文字体库的使用 2. 实现过程 2.1 创建项目和添加引用 首先,我们需要创建一个控制台应用程序的项目,然后在该项目中添加System.Drawing和Sy…

    C# 2023年6月7日
    00
  • 一个支持普通分页和综合分页的MVC分页Helper

    针对这个话题,我将提供一个完整的攻略来实现一个支持普通分页和综合分页的MVC分页Helper。 目录 前言 步骤1:创建分页Helper 步骤2:使用分页Helper 示例1:普通分页 示例2:综合分页 前言 MVC中的分页是非常常见的需求,通过分页我们可以实现对数据的有序浏览和管理。普通分页的实现其实并不是太难,但是如何实现综合分页则有些复杂。在这里,我将…

    C# 2023年5月31日
    00
  • c#实现从字符串数组中把数字的元素找出来

    要实现从字符串数组中把数字的元素找出来,可以采用正则表达式的方法。具体实现步骤如下: 步骤一:引入命名空间 using System.Text.RegularExpressions; 步骤二:定义字符串数组 string[] source = { "123", "abc", "45.6", &quo…

    C# 2023年6月7日
    00
合作推广
合作推广
分享本页
返回顶部