C#中Linq的去重方式Distinct详解

C#中Linq的去重方式Distinct详解

在C#中使用Linq可以方便地操作集合数据,去重是常见的操作之一,Distinct方法可以帮助我们快速实现去重。

Distinct方法的语法

使用Linq的Distinct方法可以对一个集合进行去重。其语法如下:

public static IEnumerable<TSource> Distinct<TSource>(this IEnumerable<TSource> source);

其中参数source表示输入的集合,返回值为一个去重后的IEnumerable<TSource>类型的序列。

Distinct方法的使用方式

Distinct方法可以应用于所有实现了IEnumerable接口的集合类型。例如:

var list = new List<int>() { 2, 5, 4, 2, 3, 1, 5, 3 };
var distinctList = list.Distinct();

上面的代码中,我们创建一个整数类型的List集合,其中包含重复的元素。调用Distinct方法获取去重后的集合,distinctList中的元素是2, 5, 4, 3, 1

Distinct方法原理

Distinct方法通过比较集合中的元素来实现去重,基本原理为:使用对元素进行哈希的方法来检测重复元素。Distinct方法通过调用元素的GetHashCode方法来检测元素的哈希码,如果两个元素的哈希码相同,则调用元素的Equals方法比较它们是否相等。

默认情况下,Distinct方法使用元素类型的默认比较器(EqualityComparer.Default)来比较元素。如果元素类型没有重载Equals方法,则默认使用Object.Equals方法来比较元素。

自定义Distinct方法的比较器

有时候默认的比较器不能满足我们的需求,我们可以自定义比较器来完成特定的比较操作。例如:我们有一个Person类,需要按照行业来进行去重:

class Person
{
    public string Name { get; set; }
    public string Industry { get; set; }
}

var people = new List<Person>() 
{
    new Person { Name = "张三", Industry = "IT" },
    new Person { Name = "李四", Industry = "IT" },
    new Person { Name = "王五", Industry = "金融" },
    new Person { Name = "赵六", Industry = "金融" },
};

var distinctPeople = people.Distinct(new PersonComparer());

上面的代码中,我们定义了一个PersonComparer类,实现了IEqualityComparer接口,重载了GetHashCode和Equals方法。然后我们调用Distinct方法并传入自定义的比较器,获得按照行业Industry去重后的集合。

下面是PersonComparer类的定义和使用:

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

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

总结

使用Linq的Distinct方法可以快速实现集合的去重操作,可以应用于所有实现了IEnumerable接口的集合类型。如果默认的比较器不能满足需求,可以自定义比较器来实现特定的比较操作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#中Linq的去重方式Distinct详解 - Python技术站

(0)
上一篇 2023年6月1日
下一篇 2023年6月1日

相关文章

  • C# 数组删除元素的实现示例

    C# 数组删除元素的实现示例 在 C# 中,我们可以使用多种方式删除数组中的元素。本文介绍两种最常见的方法。 方法一:使用 Linq 扩展方法实现 使用 Linq 扩展方法可以优雅地实现对数组的删除操作。下面是示例代码: int[] arr = { 1, 2, 3, 4, 5 }; arr = arr.Where(x => x != 3).ToArra…

    C# 2023年6月7日
    00
  • ASP.NET MVC3手把手教你构建Web

    “ASP.NET MVC3手把手教你构建Web”是一篇教程,它旨在指导读者使用ASP.NET MVC3框架来构建Web应用程序。本教程详细介绍了使用MVC模式设计Web应用程序的各个方面,包括模型、视图和控制器。 下面是该教程的完整攻略: 介绍 在本教程中,我们将使用ASP.NET MVC3框架来创建一个简单的Web应用程序。在这个过程中,我们将介绍MVC模…

    C# 2023年6月3日
    00
  • C# Path.GetRandomFileName – 获取一个随机文件名

    Path.GetRandomFileName 方法是C#中的一个静态方法,其返回一个随机生成的文件名(不包含路径),该方法的作用是用于生成一个随机的文件名,以避免文件名的冲突问题。 使用该方法非常简单,只需要在代码中调用该静态方法即可,该方法的语法格式如下: public static string GetRandomFileName(); 该方法返回一个字…

    C# 2023年4月19日
    00
  • c#判断字符是否为中文的三种方法分享(正则表达式判断)

    当我们需要实现c#中判断一个字符是否为中文时,可以运用以下三种方法进行判断: 1. Unicode码判断法 Unicode码代表着一个全球通用的编码标准,它为每个字符分配了一个唯一的标识。 中文的Unicode编码范围为 4E00 ~ 9FFF,因此可以通过以下代码实现中文判断: public static bool IsChinese(char c) { …

    C# 2023年6月8日
    00
  • C# BitArray点阵列的使用

    C# BitArray点阵列的使用攻略 什么是BitArray点阵列 BitArray是.NET Framework中的一个类,代表了一个由布尔值组成的数组,用于在内存中保存一组位(bits)信息。它可以方便地进行位级别的操作和计算。 创建BitArray点阵列 可以通过以下两种方法创建BitArray实例: 1.使用BitArray构造函数创建 //构造函…

    C# 2023年6月7日
    00
  • 详解C#获取特定进程CPU和内存使用率

    详解C#获取特定进程CPU和内存使用率 想要获取特定进程的CPU和内存使用率,我们可以使用C#语言结合System.Diagnostics命名空间提供的相关API来实现。 步骤一:获取特定进程 首先我们需要获取我们想要获取的那个进程的实例,可以采用以下方法: Process process = Process.GetProcessesByName(&quot…

    C# 2023年6月7日
    00
  • 字符串阵列String[]转换为整型阵列Int[]的实例

    将字符串数组String[]转换为整型数组int[]是编程中很常见的操作,我们可以使用Java提供的内置函数进行转换。 以下是转换的完整攻略: 1.遍历字符串数组 首先,我们需要遍历字符串数组String[],并且将每个元素转换为整型。 String[] strArray = {"10", "20", "30…

    C# 2023年6月8日
    00
  • C#如何检测操作系统版本

    如果你想要检测操作系统版本的信息,可以使用以下代码来获取: using System; using Microsoft.Win32; class Program { static void Main() { string osVersion = GetOSVersion(); Console.WriteLine("当前操作系统版本为: "…

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