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

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

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

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>结合循环来手动实现去重(效率较高,适用于较复杂场景)

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. 使用自定义方法和循环进行去重(相对更基础、直观,但代码量可能稍多)

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

12-13 18:23