前言
现在AI越来越强大了,有很多问题其实不需要在去各个网站上查了,直接问AI就好了,但是呢,AI给的代码可能能用,也可能需要调整,但是自己肯定是要会的,所以还是总结一下吧。
问题
如果有一个对象集合,想要进行去重,直接通过Distinct
是不可以的,因为对象是属于引用类型,对引用类型进行比较的时候,比较的是对象的引用地址,而集合中的不同对象的地址是不一样的,所以无法通过Distinct
进行去重。比如下面这段代码。
namespace 对象集合去重
{internal class Program{static void Main(string[] args){var books = new List<Book>();books.Add(new Book() { Id = 1, Name = "C#" });books.Add(new Book() { Id = 1, Name = "C#" });books.Add(new Book() { Id = 2, Name = "JAVA" });books.Add(new Book() { Id = 2, Name = "JAVA" });books.Add(new Book() { Id = 3, Name = "Python" });var distinctBooks = books.Distinct();foreach (var book in distinctBooks){Console.WriteLine(book.ToString());}}}class Book{public int Id;public string? Name;public override string ToString(){return $"Id={Id},Name={Name}";}}
}
输出结果如下
解决方式
那么如何解决这个问题呢?解决的方法有很多,可以用遍历重新比较值或者其他方法解决,那么今天我就来介绍一个简单的方法。Distinct
默认是使用Equals
方法比较是否相等,在对象集合里,默认比较的是引用,那么我们也只是需要重写Equals
方法,让它进行值的比较就可以了。
可以直接重写Equals
方法,也可以继承IEquatable
接口实现Equals
方法,完整代码如下。
注意别忘了也需要重写
GetHashCode
方法哟。
namespace 对象集合去重
{internal class Program{static void Main(string[] args){var books = new List<Book>();books.Add(new Book() { Id = 1, Name = "C#" });books.Add(new Book() { Id = 1, Name = "C#" });books.Add(new Book() { Id = 2, Name = "JAVA" });books.Add(new Book() { Id = 2, Name = "JAVA" });books.Add(new Book() { Id = 3, Name = "Python" });var distinctBooks = books.Distinct();foreach (var book in distinctBooks){Console.WriteLine(book.ToString());}}}class Book: IEquatable<Book>{public int Id;public string? Name;public bool Equals(Book? other){return other!=null && Id == other.Id && Name==other.Name;}public override int GetHashCode(){return HashCode.Combine(Id, Name);}public override string ToString(){return $"Id={Id},Name={Name}";}}
}
输出结果如下。
OK 解决。
Study hard and make progress every day.