2010-03-31 34 views
5

Tôi đang sử dụng Contains() để xác định thứ gì đó KHÔNG có trong danh sách. Vì vậy, một cái gì đó như thế nào,! Chứa() đối tượng Danh sách không hoạt động

if(!list.Contains(MyObject)) 
{ 
//do something 
} 

nhưng, toàn bộ câu lệnh if đi đúng mặc dù MyObject là đã có trong danh sách.

+0

Bạn cần hiển thị cho chúng tôi mã của phương thức Chứa. – Timores

+1

@Timores: Chứa() là một phương thức trên Danh sách . –

Trả lời

3

Nếu bạn không có khả năng ghi đè bằng (hoặc nếu bạn không muốn), bạn có thể triển khai IEqualityComparer<T> đối tượng và chuyển đối tượng đó làm tham số thứ hai cho phương thức chứa (quá tải). Nếu đối tượng của bạn là một kiểu tham chiếu, nó sẽ chỉ đơn giản là so sánh các tham chiếu thay vì nội dung của đối tượng.

class Foo 
{ 
    public string Blah { get; set; } 
} 

class FooComparer : IEqualityComparer<Foo> 
{ 
    #region IEqualityComparer<Foo> Members 

    public bool Equals(Foo x, Foo y) 
    { 
     return x.Blah.Equals(y.Blah); 
    } 

    public int GetHashCode(Foo obj) 
    { 
     return obj.Blah.GetHashCode(); 
    } 

    #endregion 
} 

...

Foo foo = new Foo() { Blah = "Apple" }; 
Foo foo2 = new Foo() { Blah = "Apple" }; 

List<Foo> foos = new List<Foo>(); 

foos.Add(foo); 
if (!foos.Contains(foo2, new FooComparer())) 
    foos.Add(foo2); 

Trong kịch bản này, foo2 sẽ không được thêm vào danh sách. Nó sẽ không có đối số so sánh.

9

Loại MyObject là gì? Liệu nó có một phương thức Equals() đúng cách overriden?

+0

Đó là đối tượng được người dùng xác định và chỉ có 3 chủ sở hữu, 2 chuỗi và 1 số nguyên. – Tony

+0

Từ MSDN: "Việc thực hiện mặc định của Equals hỗ trợ bình đẳng tham chiếu cho các loại tài liệu tham khảo [...]. Bình đẳng tham chiếu có nghĩa là tham chiếu đối tượng được so sánh tham chiếu đến cùng một đối tượng." Chứa() sử dụng trình so sánh bình đẳng mặc định, lần lượt gọi hàm Equals() (trừ khi lớp của bạn triển khai IEquatable, nhưng đó là bên cạnh điểm). Vì vậy, đừng mong đợi Contains() có hành vi tốt nếu bạn không ghi đè Equals(). –

1

Nếu bạn đang thử tìm đối tượng trong một số List<T>, thì tham số trong phương thức Contains() phải là cùng một ví dụ làm đối tượng trong danh sách. Nó sẽ không hoạt động nếu chúng là hai trường hợp riêng biệt nhưng giống nhau.

+1

Không cần phải là cùng một ví dụ nếu lớp ghi đè phương thức Bằng và sau này trả về true – PierrOz

Các vấn đề liên quan