📜  c# distinct comparer 多个属性 - C# (1)

📅  最后修改于: 2023-12-03 14:59:39.924000             🧑  作者: Mango

C# distinct comparer 多个属性

在C#中,我们经常需要对对象进行比较和排序。有时候,我们需要按照多个属性进行比较和排序,而不仅仅是单个属性。本文将介绍如何实现多个属性的比较和排序,以及如何通过自定义比较器实现去重。

多个属性的比较和排序

假设我们有一个Person类,该类包含以下属性:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
}

如果我们想要按照FirstName、LastName和Age对Person对象进行排序,可以使用LINQ的OrderBy方法。例如,以下代码将按照FirstName、LastName和Age的升序对Person列表进行排序:

List<Person> people = new List<Person>();
people.Add(new Person() { FirstName = "John", LastName = "Doe", Age = 30 });
people.Add(new Person() { FirstName = "Jane", LastName = "Doe", Age = 25 });
people.Add(new Person() { FirstName = "John", LastName = "Smith", Age = 25 });

var sortedPeople = people.OrderBy(p => p.FirstName)
                         .ThenBy(p => p.LastName)
                         .ThenBy(p => p.Age);

在OrderBy方法中,我们首先按照FirstName进行排序,然后在FirstName相同时按照LastName进行排序,最后在FirstName和LastName都相同时按照Age进行排序。这将返回一个按照这三个属性排序的Person列表。

自定义比较器

有时候,我们需要对Person对象进行去重。例如,我们想要从以下Person列表中去重所有重复的Person对象:

List<Person> people = new List<Person>();
people.Add(new Person() { FirstName = "John", LastName = "Doe", Age = 30 });
people.Add(new Person() { FirstName = "Jane", LastName = "Doe", Age = 25 });
people.Add(new Person() { FirstName = "John", LastName = "Smith", Age = 25 });
people.Add(new Person() { FirstName = "John", LastName = "Doe", Age = 30 });

如果我们使用Distinct方法,它将默认按照对象的引用进行去重。因此,我们需要实现一个自定义的比较器来判断Person对象是否相等。

以下是一个自定义的PersonComparer类,它实现了IEqualityComparer接口:

public class PersonComparer : IEqualityComparer<Person>
{
    public bool Equals(Person x, Person y)
    {
        if (x == null || y == null)
            return false;
        if (x.FirstName == y.FirstName &&
            x.LastName == y.LastName &&
            x.Age == y.Age)
            return true;
        else
            return false;
    }

    public int GetHashCode(Person obj)
    {
        return obj.FirstName.GetHashCode() ^
               obj.LastName.GetHashCode() ^
               obj.Age.GetHashCode();
    }
}

在Equals方法中,我们首先检查对象是否为空,然后比较Person对象的FirstName、LastName和Age属性是否相等。在GetHashCode方法中,我们使用异或运算符将Person对象的三个属性的哈希值组合成一个新哈希值。这将确保具有相同FirstName、LastName和Age的Person对象具有相同的哈希值。

现在,我们可以使用PersonComparer类将Person列表转换为HashSet,从而实现去重。例如,以下代码将返回一个没有重复Person对象的HashSet:

var distinctPeople = people.Distinct(new PersonComparer());
总结

C#中的LINQ提供了强大的排序和比较功能。通过使用OrderBy方法,我们可以按照多个属性对对象进行排序。通过自定义比较器,我们可以实现去重。希望本文可以帮助您更好地理解这些概念,并为您的项目提供帮助。