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

相关推荐
simonkimi1 小时前
解决无法在Cursor中使用C# Dev Kit的问题
c#·cursor
黎明smaly2 小时前
【排序】插入排序
c语言·开发语言·数据结构·c++·算法·排序算法
CCF_NOI.2 小时前
(普及−)B3629 吃冰棍——二分/模拟
数据结构·c++·算法
摆烂工程师3 小时前
(5千字总结)国内如何安装和使用 Claude Code 的保姆级教程 - 支持Mac和Windows用户
windows·macos·claude
神的孩子都在歌唱3 小时前
3423. 循环数组中相邻元素的最大差值 — day97
java·数据结构·算法
艾莉丝努力练剑5 小时前
【C语言】学习过程教训与经验杂谈:思想准备、知识回顾(三)
c语言·开发语言·数据结构·学习·算法
枯萎穿心攻击7 小时前
ECS由浅入深第三节:进阶?System 的行为与复杂交互模式
开发语言·unity·c#·游戏引擎
小码编匠8 小时前
WPF 自定义TextBox带水印控件,可设置圆角
后端·c#·.net
水果里面有苹果8 小时前
17-C#的socket通信TCP-1
开发语言·tcp/ip·c#
Bruce_Liuxiaowei10 小时前
Netstat高级分析工具:Windows与Linux双系统兼容的精准筛查利器
linux·运维·网络·windows·安全