1. 什么是Linq的Distinct方法
Linq的Distinct方法是用于从序列中移除重复元素的方法。它返回一个新的序列,其中只包含原始序列中的不重复元素。在C#中,我们可以使用Distinct方法来去除重复项,并提取唯一值。
2. Linq的Distinct方法语法
Linq的Distinct方法有多种使用方式,下面以常用的方式进行详解:
2.1 单个属性去重
当我们有一个包含多个对象的集合,每个对象都有一个属性,我们希望基于这个属性进行去重时,可以使用Distinct方法。
List<Person> people = new List<Person>()
{
new Person { Name = "Tom", Age = 20 },
new Person { Name = "Jack", Age = 30 },
new Person { Name = "Tom", Age = 40 },
new Person { Name = "Jack", Age = 50 },
};
var distinctPeople = people.DistinctBy(p => p.Name);
上述代码中,我们创建了一个包含Person对象的列表。然后,通过传递一个Lambda表达式p => p.Name给DistinctBy方法,指定DistinctBy方法的比较准则为Name属性。最后,得到了一个只包含不重复名字的Person对象列表distinctPeople。
2.2 多个属性去重
如果我们希望根据多个属性进行去重,可以传递一个含有多个属性的匿名类型或自定义类型给DistinctBy方法。
var distinctPeople = people.DistinctBy(p => new { p.Name, p.Age });
上述代码中,我们通过传递一个含有Name和Age属性的匿名类型给DistinctBy方法,实现了根据多个属性进行去重的目的。
2.3 自定义比较器去重
有时候,我们希望自定义去重的比较规则,我们可以编写一个实现IEqualityComparer接口的比较器,并将该实例传递给Distinct方法。
class PersonComparer : IEqualityComparer<Person>
{
public bool Equals(Person x, Person y)
{
return x.Name == y.Name && x.Age == y.Age;
}
public int GetHashCode(Person obj)
{
return obj.Name.GetHashCode() ^ obj.Age.GetHashCode();
}
}
var distinctPeople = people.Distinct(new PersonComparer());
上述代码中,我们通过实现IEqualityComparer接口的PersonComparer类,定义了自己的比较规则。然后,将PersonComparer的一个实例传递给Distinct方法,使得Distinct根据我们自定义的比较器进行去重。
3. 注意事项
使用Linq的Distinct方法需要注意以下几点:
Distinct方法会返回一个新的序列,原始序列不会受到影响。
Distinct方法默认是根据元素的默认比较规则去除重复项的,如果希望自定义比较规则,需要传递一个实现IEqualityComparer接口的比较器。
Distinct方法是基于序列中元素的哈希值进行去重的,因此,元素的哈希值必须正确实现。
如果序列中的元素是自定义类型,需要重写Equals和GetHashCode方法,以确保Distinct方法能够正确去重。
4. 总结
通过Linq的Distinct方法,我们可以方便地去除序列中的重复项,提取出唯一的值。常见的用法包括根据单个属性去重、根据多个属性去重和自定义比较器去重。在实际开发中,我们经常会遇到需要去重的情况,掌握Distinct方法的使用,能够极大地提升我们的开发效率。