2012-12-18 90 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; } 
    } 
}