以下是几种在C#中从List<T>
提取某个属性值并进行去重的常见方法,这里假设T
是一个自定义类,且包含需要提取并去重的属性,示例代码如下:
1. 使用LINQ的Select
和Distinct
方法(推荐)
假如有一个类Person
,包含Name
和Age
属性,现在要从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
方式在处理大量数据时效率往往较高;自定义方法的方式则更便于根据特殊需求灵活调整逻辑。