我有一个自定义对象列表,想要删除其中的重复记录。我看到很多在线文章都指向了IEqualityComparer
(我以前从未使用过它)。
问题是,何时应该使用它?我可以在一行代码中通过LINQ
实现相同的结果。
例如:
public static void Main(string[] args)
{
Product[] products =
{
new Product {Name = "apple", Code = 9},
new Product {Name = "orange", Code = 4},
new Product {Name = "apple", Code = 9},
new Product {Name = "lemon", Code = 12}
};
// Using Custom comparer
var usingCustomComparer = products.Distinct(new ProductComparer()).ToList();
// Using LINQ
var usinLinq = products.GroupBy(x => x.Name).Select(y => y.First()).ToList();
}
public class Product
{
public string Name { get; set; }
public int Code { get; set; }
}
// Custom comparer for the Product class
private class ProductComparer : IEqualityComparer<Product>
{
public bool Equals(Product x, Product y)
{
if (ReferenceEquals(x, y)) return true;
if (ReferenceEquals(x, null) || ReferenceEquals(y, null)) return false;
return x.Code == y.Code && x.Name == y.Name;
}
public int GetHashCode(Product product)
{
var hashProductName = product.Name == null ? 0 : product.Name.GetHashCode();
var hashProductCode = product.Code.GetHashCode();
return hashProductName ^ hashProductCode;
}
}
两者的结果:
{Name = "apple", Code = 9},
{Name = "orange", Code = 4},
{Name = "lemon", Code = 12}
IEqualityComparer
。如果存在,则字典添加或任何集合上的查找可能使用IEqualityComparer。 - Christopher