C#中Linq的去重方式Distinct详解

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方法的使用,能够极大地提升我们的开发效率。

后端开发标签