如何搜索泛型集合以查看对象的属性是否相等?
List<Customer> = customers = GetCustomers();
Customer c = new Customer() { FirstName = "Sam" };
customers.Contains(c); //doesn't work
答案 0 :(得分:5)
您需要为对象定义“相等”。你可以通过以下几种方式做到这一点。
Equals
本身的Customer
方法,以便它使用您认为的平等。IEqualityComparer
包含。如果您需要在不同时间使用不同的“相等”定义,或者如果您无法修改类型,请执行此操作。请注意,每当您为某个类型覆盖Equals
时,重要的是覆盖GetHashCode
,反之亦然。确保Equals
定义认为相同的任何对象也具有相同的哈希码非常重要。在这种特殊情况下无关紧要,但在使用基于散列的数据结构时会很重要。
答案 1 :(得分:1)
重写Equals,实现IEqualityComparer并重写GetHashCode是一项工作。
如果你有Resharper,你可以generate these methods。
我唯一一次覆盖Equals,实现IEqualityComparer并覆盖GetHashCode,如果我计划在整个应用程序中比较客户。可能还有其他一些原因,例如排序。
如果只在一个位置进行比较,LINQ扩展会为您提供强大的设置方法 查找和检索项目。在找到覆盖Equals方法的麻烦之前,我会先看一下。
[TestFixture]
public class ContainsTest
{
[Test]
public void TestFind()
{
var customers = new List<Customer>
{
new Customer() {FirstName = "Chuck"},
new Customer() {FirstName = Path.GetRandomFileName()},
new Customer() {FirstName = Path.GetRandomFileName()},
new Customer() {FirstName = Path.GetRandomFileName()},
new Customer() {FirstName = Path.GetRandomFileName()},
};
//Get all objects that match
var findResult = customers.Find(c => c.FirstName =="Chuck");
var findSingle = customers.Single(c => c.FirstName == "Chuck");
//Has at least one instance
customers.Any(c => c.FirstName.Contains("Chuck"));
}
public class Customer
{
public string FirstName { get; set; }
}
}