以下是关于“完美解决c# distinct不好用的问题”的完整攻略:
问题描述
在 C# 中使用 Distinct()
方法可以去除一个集合中的重复元素,但是如果需要去除自定义类中的成员变量重复的方法时,经常会遇到以下两个问题:
- 需要先实现
IEqualityComparer
接口; - 直接使用
Distinct()
方法对 List 自定义类对象去重会报错。
以下是解决这两个问题的完整攻略。
解决方法
方法一
实现 IEqualityComparer
接口,作为参数传递给 Distinct()
方法。
以下是示例代码:
// 自定义类的实现
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
}
// 自定义比较器
public class PersonEqualityComparer : IEqualityComparer<Person>
{
public bool Equals(Person x, Person y)
{
if (x.Id == y.Id && x.Name == y.Name)
{
return true;
}
return false;
}
public int GetHashCode(Person obj)
{
return obj.Id.GetHashCode() + obj.Name.GetHashCode();
}
}
// 示例代码
List<Person> personList = new List<Person>()
{
new Person(){ Id=1, Name="Lily"},
new Person(){ Id=1, Name="Lily"},
new Person(){ Id=2, Name="Lucas"},
new Person(){ Id=3, Name="Tom"},
new Person(){ Id=3, Name="Tom"}
};
var distinctList = personList.Distinct(new PersonEqualityComparer());
方法二
重写自定义类的 Equals()
和 GetHashCode()
方法,直接使用 Distinct()
方法去重。
以下是示例代码:
// 自定义类的实现
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
// 重写 Equals 方法比较对象是否相等
public override bool Equals(object obj)
{
if (obj == null)
{
return false;
}
if (this.GetType() != obj.GetType())
{
return false;
}
Person p = (Person)obj;
return (this.Id == p.Id) && (this.Name == p.Name);
}
// 重写 GetHashCode 方法获取对象的 Hash 值
public override int GetHashCode()
{
return this.Id.GetHashCode() + this.Name.GetHashCode();
}
}
// 示例代码
List<Person> personList = new List<Person>()
{
new Person(){ Id=1, Name="Lily"},
new Person(){ Id=1, Name="Lily"},
new Person(){ Id=2, Name="Lucas"},
new Person(){ Id=3, Name="Tom"},
new Person(){ Id=3, Name="Tom"}
};
var distinctList = personList.Distinct();
总结
以上是两种解决在 C# 中使用 Distinct()
方法去重自定义类对象的完整攻略,可以根据具体情况选择使用哪种方法。无论是哪种方法,都可以完美解决 C# Distinct 方法不好用的问题。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:完美解决c# distinct不好用的问题 - Python技术站