完美解决c# distinct不好用的问题

以下是关于“完美解决c# distinct不好用的问题”的完整攻略:

问题描述

C# 中使用 Distinct() 方法可以去除一个集合中的重复元素,但是如果需要去除自定义类中的成员变量重复的方法时,经常会遇到以下两个问题:

  1. 需要先实现 IEqualityComparer 接口;
  2. 直接使用 Distinct() 方法对 List 自定义类对象去重会报错。

以下是解决这两个问题的完整攻略。

解决方法

方法一

实现 IEqualityComparer 接口,作为参数传递给 Distinct() 方法。

以下是示例代码:

// 自定义类的实现
public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}

// 自定义比较器
public class PersonEqualityComparer : IEqualityComparer<Person>
{
    public bool Equals(Person x, Person y)
    {
        if (x.Id == y.Id && x.Name == y.Name)
        {
            return true;
        }
        return false;
    }

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

// 示例代码
List<Person> personList = new List<Person>()
{
    new Person(){ Id=1, Name="Lily"},
    new Person(){ Id=1, Name="Lily"},
    new Person(){ Id=2, Name="Lucas"},
    new Person(){ Id=3, Name="Tom"},
    new Person(){ Id=3, Name="Tom"}
};

var distinctList = personList.Distinct(new PersonEqualityComparer());

方法二

重写自定义类的 Equals()GetHashCode() 方法,直接使用 Distinct() 方法去重。

以下是示例代码:

// 自定义类的实现
public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }

    // 重写 Equals 方法比较对象是否相等
    public override bool Equals(object obj)
    {
        if (obj == null)
        {
            return false;
        }

        if (this.GetType() != obj.GetType())
        {
            return false;
        }

        Person p = (Person)obj;
        return (this.Id == p.Id) && (this.Name == p.Name);
    }

    // 重写 GetHashCode 方法获取对象的 Hash 值
    public override int GetHashCode()
    {
        return this.Id.GetHashCode() + this.Name.GetHashCode();
    }
}

// 示例代码
List<Person> personList = new List<Person>()
{
    new Person(){ Id=1, Name="Lily"},
    new Person(){ Id=1, Name="Lily"},
    new Person(){ Id=2, Name="Lucas"},
    new Person(){ Id=3, Name="Tom"},
    new Person(){ Id=3, Name="Tom"}
};

var distinctList = personList.Distinct();

总结

以上是两种解决在 C# 中使用 Distinct() 方法去重自定义类对象的完整攻略,可以根据具体情况选择使用哪种方法。无论是哪种方法,都可以完美解决 C# Distinct 方法不好用的问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:完美解决c# distinct不好用的问题 - Python技术站

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

相关文章

  • C#实现读取DataSet数据并显示在ListView控件中的方法

    C#实现读取DataSet数据并显示在ListView控件中的方法 1. 创建DataSet对象并添加DataTable 首先,需要创建一个DataSet对象并添加一个或多个DataTable对象,来存储需要读取的数据。示例代码如下: DataSet dataSet = new DataSet(); DataTable table = new DataTab…

    C# 2023年6月7日
    00
  • .NET异步编程总结—-四种实现模式代码总结

    “.NET异步编程总结—-四种实现模式代码总结”是一篇涉及异步编程的技术总结文章,对于需要使用异步编程进行开发的.NET开发人员来说,本文是一份非常有用的参考材料。下面将详细讲解这篇文章的内容和适用场景,同时提供两个相关示例。 一、适用场景 异步编程是一种可以提高程序性能、改善用户体验的编程模式。在系统需要进行高并发、高 I/O 的情况下,异步编程表现出…

    C# 2023年5月31日
    00
  • C#对桌面应用程序自定义鼠标光标

    当我们需要在C#桌面应用程序中改变鼠标光标的默认外观时,可以使用C#编程语言中提供的Cursor类。下面是关于如何使用Cursor类来实现自定义鼠标光标的攻略: 导入命名空间 在使用Cursor类之前,需要先导入System.Windows.Forms命名空间。代码如下: using System.Windows.Forms; 加载自定义光标文件 在使用自定…

    C# 2023年6月7日
    00
  • asp.net 截取Http请求的实现代码

    当我们需要对Http请求做一些特殊的处理时,我们可能需要截取Http请求。在ASP.NET中,我们可以通过编写HttpModule和HttpHandler来实现对Http请求的截取。 HttpModule实现截取Http请求 1.创建HttpModule 首先,我们需要创建一个继承自System.Web.IHttpModule接口的类。该接口具有两个方法:I…

    C# 2023年5月31日
    00
  • 在ASP.NET 2.0中操作数据之二:创建一个业务逻辑层

    创建一个业务逻辑层(Business Logic Layer, BLL)是在ASP.NET 2.0中操作数据的一个重要方面,这个层次实现了在数据层之上的逻辑层次。 以下是在ASP.NET 2.0中创建业务逻辑层的完整攻略: 1. 在项目中加入一个业务逻辑层 创建一个新Web应用程序,并选择ASP.NET空白网站模板。选择一个好的名称和位置,然后创建并打开解决…

    C# 2023年5月31日
    00
  • 使用C#获取系统特殊文件夹路径的解决方法

    当我们搭建一个桌面应用程序时,需要获取一些系统特殊文件夹的路径,比如应用程序数据文件夹、用户文档文件夹等。使用C#可以方便地获取这些文件夹路径,下面是一些详细的攻略介绍。 1. 使用Environment.SpecialFolder枚举获取系统特殊文件夹路径 Environment.SpecialFolder枚举包含了系统特殊文件夹的名称,可以通过该枚举获取…

    C# 2023年6月7日
    00
  • Asp.Net Core配置多环境log4net配置文件的全过程

    在 ASP.NET Core 项目中,使用 log4net 记录日志是一种常见的方式。在多环境下,我们需要为每个环境配置不同的 log4net 配置文件。以下是 ASP.NET Core 配置多环境 log4net 配置文件的全过程: 步骤一:添加 log4net 包 首先,需要在 ASP.NET Core 项目中添加 log4net 包。可以使用 NuGe…

    C# 2023年5月17日
    00
  • WPF调用Matlab函数的方法

    WPF调用Matlab函数的方法通常分为两种方式:COM接口和MCR运行时引擎。下面我可以详细讲解这两种方法的步骤和示例。 COM接口调用Matlab函数 步骤 在Matlab中编写一个COM可调用的函数,例如文件名为“Demo.m”,函数名为“Demo”。 matlab function output = Demo(input) % input为一个数字 …

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