前言
现在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.