C#集合根据对象的某个属性进行去重的代码示例

 更新时间:2024年03月18日 10:33:35   作者:周杰伦fans  
当根据对象的Name属性进行去重时,你可以使用以下三种方法:使用Distinct方法和自定义比较器、使用LINQ的GroupBy方法,以及使用HashSet,下面给大家介绍C#集合根据对象的某个属性进行去重的代码示例,感兴趣的朋友一起看看吧

脚本之家 / 编程助手:解决程序员“几乎”所有问题!
脚本之家官方知识库 → 点击立即使用

当根据对象的Name属性进行去重时,你可以使用以下三种方法:使用Distinct方法和自定义比较器、使用LINQ的GroupBy方法,以及使用HashSet。下面是每种方法的详细代码示例和解释:

1.使用Distinct方法和自定义比较器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
using System;
using System.Collections.Generic;
using System.Linq;
// 自定义对象类
public class Person
{
    public string Name { get; set; }
}
// 自定义比较器类
public class NameEqualityComparer : IEqualityComparer<Person>
{
    public bool Equals(Person x, Person y)
    {
        return x.Name == y.Name;
    }
    public int GetHashCode(Person obj)
    {
        return obj.Name.GetHashCode();
    }
}
public class Program
{
    public static void Main()
    {
        // 创建包含重复对象的集合
        List<Person> people = new List<Person>()
        {
            new Person { Name = "John" },
            new Person { Name = "Jane" },
            new Person { Name = "John" },
            new Person { Name = "Alice" },
            new Person { Name = "Jane" }
        };
        // 使用Distinct方法和自定义比较器进行去重
        List<Person> distinctPeople = people.Distinct(new NameEqualityComparer()).ToList();
        // 输出去重后的结果
        foreach (Person person in distinctPeople)
        {
            Console.WriteLine(person.Name);
        }
    }
}

解释:

  • 在上述代码中,我们首先定义了一个Person类,具有Name属性作为去重的依据。
  • 然后,我们创建了一个包含重复对象的List<Person>集合。
  • 接下来,我们定义了一个名为NameEqualityComparer的自定义比较器类,实现了IEqualityComparer<Person>接口。
  • 在自定义比较器类中,我们重写了Equals方法和GetHashCode方法,分别根据Person对象的Name属性进行比较和哈希计算。
  • 在主程序中,我们使用Distinct方法,并将自定义比较器作为参数传递给该方法,以实现根据Name属性进行去重的功能。
  • 最后,我们将去重后的结果转换为List<Person>类型,并逐个输出去重后的Person对象的Name属性。

2.使用LINQ的GroupBy方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using System;
using System.Collections.Generic;
using System.Linq;
// 自定义对象类
public class Person
{
    public string Name { get; set; }
}
public class Program
{
    public static void Main()
    {
        // 创建包含重复对象的集合
        List<Person> people = new List<Person>()
        {
            new Person { Name = "John" },
            new Person { Name = "Jane" },
            new Person { Name = "John" },
            new Person { Name = "Alice" },
            new Person { Name = "Jane" }
        };
        // 使用GroupBy方法根据Name属性进行分组,并选择每个分组的第一个对象
        List<Person> distinctPeople = people.GroupBy(p => p.Name).Select(g => g.First()).ToList();
        // 输出去重后的结果
        foreach (Person person in distinctPeople)
        {
            Console.WriteLine(person.Name);
        }
    }
}

解释:

  • 在上述代码中,我们定义了一个Person类,具有Name属性作为去重的依据。
  • 然后,我们创建了一个包含重复对象的List<Person>集合。
  • 接下来,我们使用GroupBy方法根据Name属性进行分组。这将返回一个IEnumerable<IGrouping<string, Person>>,其中每个分组具有一个键(Name属性的值)和相应的对象集合。
  • 然后,我们使用Select方法选择每个分组的第一个对象,以实现去重的效果。
  • 最后,我们将去重后的结果转换为List<Person>类型,并逐个输出去重后的Person对象的Name属性。

3.使用HashSet:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
using System;
using System.Collections.Generic;
// 自定义对象类
public class Person
{
    public string Name { get; set; }
}
public class Program
{
    public static void Main()
    {
        // 创建包含重在C#中,你可以使用以下几种方法根据对象的Name属性对集合进行去重:
1. 使用Distinct方法和自定义比较器:
```csharp
using System;
using System.Collections.Generic;
using System.Linq;
public class Person
{
    public string Name { get; set; }
}
public class NameEqualityComparer : IEqualityComparer<Person>
{
    public bool Equals(Person x, Person y)
    {
        return x.Name == y.Name;
    }
    public int GetHashCode(Person obj)
    {
        return obj.Name.GetHashCode();
    }
}
public class Program
{
    public static void Main()
    {
        List<Person> people = new List<Person>()
        {
            new Person { Name = "John" },
            new Person { Name = "Jane" },
            new Person { Name = "John" },
            new Person { Name = "Alice" },
            new Person { Name = "Jane" }
        };
        List<Person> distinctPeople = people.Distinct(new NameEqualityComparer()).ToList();
        foreach (Person person in distinctPeople)
        {
            Console.WriteLine(person.Name);
        }
    }
}

在上面的代码中,我们定义了一个Person类,其中包含一个Name属性用于去重。然后,我们创建了一个包含重复对象的List集合。接下来,我们定义了一个NameEqualityComparer类,实现了IEqualityComparer接口,其中Equals方法用于比较Name属性是否相等,GetHashCode方法用于获取Name属性的哈希码。在主程序中,我们使用Distinct方法,并将自定义的比较器作为参数传递给Distinct方法,以实现根据Name属性进行去重的功能。最后,我们将去重后的结果转换为List类型,并遍历输出每个人物的Name属性。

4.使用LINQ的GroupBy方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
using System;
using System.Collections.Generic;
using System.Linq;
public class Person
{
    public string Name { get; set; }
}
public class Program
{
    public static void Main()
    {
        List<Person> people = new List<Person>()
        {
            new Person { Name = "John" },
            new Person { Name = "Jane" },
            new Person { Name = "John" },
            new Person { Name = "Alice" },
            new Person { Name = "Jane" }
        };
        List<Person> distinctPeople = people.GroupBy(p => p.Name).Select(g => g.First()).ToList();
        foreach (Person person in distinctPeople)
        {
            Console.WriteLine(person.Name);
        }
    }
}

在上面的代码中,我们同样定义了一个Person类,并创建了一个包含重复对象的List集合。然后,我们使用GroupBy方法根据Name属性进行分组,将相同Name属性的对象放入同一个组中。接着,我们使用Select方法选择每个组中的第一个对象,以实现去重的效果。最后,我们将去重后的结果转换为List类型,并遍历输出每个人物的Name属性。

5.使用HashSet:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
using System;
using System.Collections.Generic;
public class Person
{
    public string Name { get; set; }
}
public class Program
{
    public static void Main()
    {
        List<Person> people = new List<Person>()
        {
            new Person { Name = "John" },
            new Person { Name = "Jane" },
            new Person { Name = "John" },
            new Person { Name = "Alice" },
            new Person { Name = "Jane" }
        };
        HashSet<Person> distinctPeople = new HashSet<Person>(people, new NameEqualityComparer());
        foreach (Person person in distinctPeople)
        {
            Console.WriteLine(person.Name);
        }
    }
}

在上面的代码中,我们同样定义了一个Person类,并创建了一个包含重复对象的List集合。然后,我们使用HashSet类,并将List集合和自定义的比较器传递给HashSet的构造函数,以实现根据Name属性进行去重的功能。最后,我们遍历输出去重后的结果。

到此这篇关于C#集合根据对象的某个属性进行去重的文章就介绍到这了,更多相关C#根据对象的某个属性去重内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

蓄力AI

微信公众号搜索 “ 脚本之家 ” ,选择关注

程序猿的那些事、送书等活动等着你

原文链接:https://blog.csdn.net/ultramand/article/details/136726766

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!

相关文章

  • C#动态创建Access数据库及表的方法

    C#动态创建Access数据库及表的方法

    这篇文章主要介绍了C#动态创建Access数据库及表的方法,以实例形式分析了创建access数据库及在access数据库中建表的完整过程,是非常实用的技巧,需要的朋友可以参考下
    2014-12-12
  • C#中BackgroundWorker类用法总结

    C#中BackgroundWorker类用法总结

    本文详细讲解了C#中BackgroundWorker类用法总结,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • 浅析c# 线程同步

    浅析c# 线程同步

    这篇文章主要介绍了c# 线程同步的相关资料,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下
    2020-08-08
  • C#中32位浮点数Float(Real)一步步按位Bit进行分析

    C#中32位浮点数Float(Real)一步步按位Bit进行分析

    这篇文章主要介绍了C#中32位浮点数Float(Real)一步步按位Bit进行分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • C# IFF图形结构解析代码

    C# IFF图形结构解析代码

    这个结构有点像RIFF文件。。是分段的。但要注意ANNO这个描述字段 必须是使用2个字节 否则ACDSEE无法识别。
    2010-03-03
  • c#中的扩展方法学习笔记

    c#中的扩展方法学习笔记

    扩展方法能够向现有类型“添加”方法,而无需创建新的派生类型,重新编译或以其他方式修改原始类型。下面这篇文章主要给大家介绍了关于c#中扩展方法学习的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-11-11
  • C#多线程编程Task用法详解

    C#多线程编程Task用法详解

    本文详细讲解了C#多线程编程Task的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • 详解C#中HttpClient的用法及相关问题的解决方法

    详解C#中HttpClient的用法及相关问题的解决方法

    相信大家在使用 HttpClient 的时候遇到过 远程主机强迫关闭了一个现有的连接 的错误。本文就来说说它的解决方法以及HttpClient的正确用法,需要的可以参考一下
    2022-11-11
  • C#中数组初始化、反转和排序用法实例

    C#中数组初始化、反转和排序用法实例

    这篇文章主要介绍了C#中数组初始化、反转和排序用法,涉及C#中数组常见的定义、初始化、排序等操作技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • C# ComboBox的联动操作(三层架构)

    C# ComboBox的联动操作(三层架构)

    这篇文章主要介绍了C# ComboBox的联动操作(三层架构),根据下拉框的变化使得下拉框绑定对应值,感兴趣的小伙伴们可以参考一下
    2016-05-05

最新评论