如何搜索泛型集合以查看對象的屬性是否相等?搜索同等對象集合
List<Customer> = customers = GetCustomers();
Customer c = new Customer() { FirstName = "Sam" };
customers.Contains(c); //doesn't work
如何搜索泛型集合以查看對象的屬性是否相等?搜索同等對象集合
List<Customer> = customers = GetCustomers();
Customer c = new Customer() { FirstName = "Sam" };
customers.Contains(c); //doesn't work
您需要爲對象定義「相等」。你可以通過幾種方法來完成。
Customer
本身Equals
方法,以便它使用你所認爲的平等。IEqualityComparer
,您可以將其傳遞給包含。如果您需要在不同時間使用「平等」的不同定義,或者您無法修改類型,請執行此操作。請注意,只要您覆蓋Equals
的某個類型,重要的是也要覆蓋GetHashCode
,反之亦然。確保按照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; }
}
}
別忘了'GetHashCode'! :) –
@DStanley注意補充。 – Servy