List<T>中提取某个属性值并进行去重

以下是几种在C#中从List<T>提取某个属性值并进行去重的常见方法,这里假设T是一个自定义类,且包含需要提取并去重的属性,示例代码如下:

1. 使用LINQ的SelectDistinct方法(推荐)

假如有一个类Person,包含NameAge属性,现在要从List<Person>中提取所有人的Name属性值并去重,可以这样做:

csharp 复制代码
class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

class Program
{
    static void Main()
    {
        List<Person> people = new List<Person>()
        {
            new Person { Name = "Alice", Age = 25 },
            new Person { Name = "Bob", Age = 30 },
            new Person { Name = "Alice", Age = 28 }
        };

        var distinctNames = people.Select(p => p.Name).Distinct();
        foreach (var name in distinctNames)
        {
            Console.WriteLine(name);
        }
    }
}

在上述代码中:

  • 首先通过Select方法从List<Person>中选择出每个人的Name属性,这会返回一个IEnumerable<string>类型的结果集,其中包含了所有的Name值。
  • 然后使用Distinct方法对这个结果集进行去重操作,它会基于元素自身的相等比较(对于字符串就是基于字符串内容相等)去除重复的元素,最终得到去重后的姓名集合。

2. 使用HashSet<T>结合循环来手动实现去重(效率较高,适用于较复杂场景)

csharp 复制代码
class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

class Program
{
    static void Main()
    {
        List<Person> people = new List<Person>()
        {
            new Person { Name = "Alice", Age = 25 },
            new Person { Name = "Bob", Age = 30 },
            new Person { Name = "Alice", Age = 28 }
        };

        HashSet<string> uniqueNames = new HashSet<string>();
        foreach (var person in people)
        {
            uniqueNames.Add(person.Name);
        }

        foreach (var name in uniqueNames)
        {
            Console.WriteLine(name);
        }
    }
}

在这种方式下:

  • 创建一个HashSet<string>,它是一个基于哈希值来保证元素唯一性的数据集合,添加元素时会自动去重。
  • 通过循环遍历List<Person>中的每个元素,将其Name属性值添加到HashSet<string>中,重复添加相同的Name值时,HashSet会自动忽略,从而实现去重效果。
  • 最后再循环HashSet输出去重后的属性值。

3. 使用自定义方法和循环进行去重(相对更基础、直观,但代码量可能稍多)

csharp 复制代码
class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

class Program
{
    static List<string> GetDistinctNames(List<Person> people)
    {
        List<string> result = new List<string>();
        foreach (var person in people)
        {
            if (!result.Contains(person.Name))
            {
                result.Add(person.Name);
            }
        }
        return result;
    }

    static void Main()
    {
        List<Person> people = new List<Person>()
        {
            new Person { Name = "Alice", Age = 25 },
            new Person { Name = "Bob", Age = 30 },
            new Person { Name = "Alice", Age = 28 }
        };

        var distinctNames = GetDistinctNames(people);
        foreach (var name in distinctNames)
        {
            Console.WriteLine(name);
        }
    }
}

这种方式下:

  • 定义了一个名为GetDistinctNames的方法,它接受List<Person>作为参数。
  • 在方法内部,创建一个新的List<string>用于存放去重后的结果。然后循环遍历输入的人员列表,每次添加元素前先检查结果列表中是否已经包含该姓名,如果不包含就添加进去,以此实现去重的目的。最后返回去重后的姓名列表并输出。

具体使用哪种方法可以根据实际的业务场景、代码风格以及性能要求等来综合选择。一般来说,使用LINQ的方式代码最为简洁直观,适用于简单快速地实现功能;而HashSet方式在处理大量数据时效率往往较高;自定义方法的方式则更便于根据特殊需求灵活调整逻辑。

相关推荐
lclin_20205 小时前
VS2010兼容|C++系统全能监控工具(彩色界面+日志带单位+完整版)
c++·windows·系统监控·vs2010·编程实战
csdn_aspnet6 小时前
C# (QuickSort using Random Pivoting)使用随机枢轴的快速排序
数据结构·算法·c#·排序算法
神秘剑客_CN7 小时前
windows自带FTP服务搭建及防火墙设置
windows
广师大-Wzx7 小时前
一篇文章看懂MySQL数据库(下)
java·开发语言·数据结构·数据库·windows·python·mysql
paeamecium7 小时前
【PAT甲级真题】- Cars on Campus (30)
数据结构·c++·算法·pat考试·pat
会编程的土豆9 小时前
01背包与完全背包详解
开发语言·数据结构·c++·算法
航Hang*10 小时前
Windows Server 配置与管理——第8章:配置Web服务器
运维·服务器·windows·学习·vmware
汀、人工智能10 小时前
[特殊字符] 第86课:最大正方形
数据结构·算法·数据库架构·图论·bfs·最大正方形
jinyishu_11 小时前
几道链表经典算法题
c语言·数据结构·算法·链表
sparEE11 小时前
进阶排序算法:快速排序
数据结构·算法·排序算法