2009-04-08 26 views
7

Có thể, và nếu vậy làm cách nào để ghi đè phương pháp Contains của một cách khác bình thường List<T>, trong đó T là loại tùy chỉnh của riêng tôi?Ghi đè .NET Generic List <MyType> .Contains (MyTypeInstance)?

+0

Có một chút không rõ ràng từ câu hỏi của bạn những gì bạn cần đạt được. Bạn có a) cần các tiêu chuẩn Chứa để làm việc với loại tùy chỉnh của bạn hoặc b) làm một số logic đặc biệt khi Contains được gọi là? –

+0

Peter, về cơ bản Danh sách Tôi đang gặp không có trong bộ nhớ trong thời gian chạy, nó được lỏng lẻo/yếu tham chiếu đến một OODBMS. Nếu tôi làm một native .net .Contains trên List nó lấy toàn bộ danh sách từ phần phụ trợ oodbms và đánh giá cục bộ. Vì vậy, tôi muốn ghi đè nó bằng cú pháp truy vấn thích hợp (phụ trợ) .. –

+0

@ Jörg - vì vậy với ý nghĩ đó, cách ghi đè Equals/GetHashCode giải quyết vấn đề của bạn (@Cans answer)? –

Trả lời

5

Để làm của riêng bạn Có thực hiện bạn có thể tạo ra một lớp mà thực hiện giao diện IList. Bằng cách đó, lớp của bạn sẽ trông giống như một người theo chủ nghĩa IList. Bạn có thể có một Danh sách thực nội bộ để thực hiện các công cụ chuẩn.

class MyTypeList : IList<MyType> 
{ 
    private List<MyType> internalList = new ...; 

    public bool Contains(MyType instance) 
    { 

    } 

    .... 
} 
2

Bạn cần ghi đè EqualsGetHashCode trong lớp học của mình (MyType).

0

Nếu bạn thực hiện equals của bạn kiểu tùy chỉnh, chứa hàm Danh sách sẽ làm việc

+0

Không, Danh sách sẽ không bao giờ sử dụng toán tử ==; chỉ bằng –

+0

Đừng nghĩ rằng nó xứng đáng là một downvote, mặc dù. The Equals là đúng; cố định rằng (+1) –

7

List<T> sử dụng EqualityComparer<T>.Default để so sánh; điều này kiểm tra đầu tiên để xem đối tượng của bạn có thực hiện IEquatable<T> hay không; nếu không thì sử dụng object.Equals.

Vì vậy; điều dễ nhất cần làm là ghi đè Equals (luôn cập nhật GetHashCode để khớp với logic trong Equals). Ngoài ra, sử dụng LINQ thay vì:

bool hasValue = list.Any(x => x.Foo == someValue); 
+0

@Marc Gravell: vì vậy nếu tôi muốn kiểm tra 'bình đẳng' của 2 lớp tùy chỉnh chỉ chứa các thuộc tính và trường, tôi cần triển khai IEquatable trong lớp của tôi? Tôi đã thực sự mệt mỏi khi tôi đưa ra giả thiết rằng 2 lớp sẽ được coi là 'bình đẳng' chỉ vì các trường có cùng giá trị trong mỗi lớp. :/... cảm ơn cho tip;) – IAbstract

+0

@Marc Gravell: tốt, về mặt kỹ thuật, nó sẽ không quan trọng những gì họ chứa. Điều quan trọng là tôi 'đúng' triển khai IEquatable và chọn trường sẽ quyết định xem một MyClass khác có được coi là bình đẳng hay không. – IAbstract

+0

@dboarman - chính xác. Và lại điểm đầu tiên của bạn, IIRC struct * làm * cư xử như thế, vì vậy bạn không phải là một triệu dặm ngoài khơi. –

1

Tùy thuộc vào nhu cầu cụ thể mà bạn có trong override của bạn, bạn có thể sử dụng biểu LINQ để làm điều đó:

list.Any(x => x.Name.Equals("asdas", .....)) // whatever comparison you need 

Sau đó, bạn có thể bọc nó trong một phương pháp mở rộng để thuận tiện .