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

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

1. 使用LINQ的Select和Distinct方法(推荐)

假如有一个类Person,包含Name和Age属性,现在要从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方式在处理大量数据时效率往往较高;自定义方法的方式则更便于根据特殊需求灵活调整逻辑。

相关推荐
吃一碗粉只付一碗钱2 小时前
12-给SPA友好的401和403响应
c#·状态模式
m0_639906942 小时前
Redis入门|五种数据结构、使用场景、持久化RDB&AOF
数据结构·数据库·redis
BIBI20494 小时前
换 Git 托管平台怎么做?基于 TortoiseGit 的跨平台迁移教程
windows·git·tortoisegit·问题解决·版本控制·最佳实践
chushiyunen5 小时前
autoHotKey、windows自动化快捷键工具
运维·windows·自动化
2601_970703836 小时前
工业除湿机租赁:把一份租金合同拆开看
大数据·数据结构·算法·数据库架构·推荐算法
燃烧的枫6 小时前
Windows 下 YOLO11 Det 的 TensorRT C++ 部署
pytorch·windows·tensorrt·关键点识别·yolo11
猪八宅百炼成仙7 小时前
让 AI 帮你清理电脑而不翻车:一个 Windows 体检调优 Skill 的工程化设计
人工智能·windows
鱼宵8 小时前
取集合第一个元素,Java 为什么要写三种写法?
java·windows·python·java21
caimouse8 小时前
MonoDevelop 编译用户应用程序时调用的是哪个编译器
c#
kingx39 小时前
Windows Server 2008 应急加固实战:7 项入侵痕迹排查与修复
数据库·windows·提权·应急响应·加固