2012-12-18 42 views
0

如何搜索泛型集合以查看对象的属性是否相等?搜索同等对象集合

List<Customer> = customers = GetCustomers(); 

Customer c = new Customer() { FirstName = "Sam" }; 

customers.Contains(c); //doesn't work 

回答

5

您需要为对象定义“相等”。你可以通过几种方法来完成。

  1. 覆盖的Customer本身Equals方法,以便它使用你所认为的平等。
  2. 定义自定义比较器,该自定义比较器实现IEqualityComparer,您可以将其传递给包含。如果您需要在不同时间使用“平等”的不同定义,或者您无法修改类型,请执行此操作。

请注意,只要您覆盖Equals的某个类型,重要的是也要覆盖GetHashCode,反之亦然。确保按照Equals的定义认为相同的任何对象也具有相同的哈希码是很重要的。在这种特殊情况下,这并不重要,但使用基于散列的数据结构时,这一点很重要。

+4

别忘了'GetHashCode'! :) –

+1

@DStanley注意补充。 – Servy

1

覆盖等于,实现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; } 
    } 
}