📅  最后修改于: 2023-12-03 14:59:39.924000             🧑  作者: Mango
在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方法,我们可以按照多个属性对对象进行排序。通过自定义比较器,我们可以实现去重。希望本文可以帮助您更好地理解这些概念,并为您的项目提供帮助。