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方式在处理大量数据时效率往往较高;自定义方法的方式则更便于根据特殊需求灵活调整逻辑。

相关推荐
一个假的前端男8 小时前
windows flutter 适配鸿蒙
windows·flutter·harmonyos
小满Autumn8 小时前
CommunityToolkit.Mvvm 架构笔记:现代 MVVM、源生成器与工程化实践
笔记·架构·c#·.net·wpf·mvvm
加号39 小时前
【C#】 JSON 序列化与反序列化:从入门到最佳实践
c#·json
V搜xhliang02469 小时前
临床科研新范式:从选题到投稿,AI智能体如何接管全流程?
运维·数据结构·人工智能·算法·microsoft·数据挖掘·自动化
梦想的颜色11 小时前
MySQL 查询性能核武器
运维·服务器·数据结构·数据库·mysql
乘凉~11 小时前
一键获取Youtube播放列表视频里的标题和链接
windows·python
八解毒剂11 小时前
查找-从二分查找到二叉排序树
数据结构·c++·算法
奋斗的好青年12 小时前
Ubuntu 修复 GRUB 引导并找回 Windows 双系统启动项(NVMe + MBR 环境)
linux·windows·ubuntu
森森-曦12 小时前
在windows系统上制作启动ubuntu_22.04.5_desktop_amd64.iso启动盘
windows·ubuntu·启动盘
luoqice12 小时前
Windows下局域网rtsp流媒体服务器搭建-测试
服务器·windows·音视频