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)?
Trả lời
Để 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)
{
}
....
}
Bạn cần ghi đè Equals
và GetHashCode
trong lớp học của mình (MyType
).
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
Không, Danh sách
Đừng nghĩ rằng nó xứng đáng là một downvote, mặc dù. The Equals là đúng; cố định rằng (+1) –
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);
@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
@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
@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. –
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 .
- 1. .NET Casting Generic List
- 2. .NET List <T> Concat vs AddRange
- 3. Một cái gì đó tương tự như C# .NET Generic List trong java
- 4. Cách ghi đè Chứa()?
- 5. C++ Ghi đè ... ghi đè?
- 6. Ghi đè hoặc ghi đè
- 7. ObservableCollection <> vs. List <>
- 8. Generic ThreadPool trong .NET
- 9. Marshalling NET kiểu generic
- 10. .NET Generic Set?
- 11. Generic .Net Producer/Consumer
- 12. List <> Comparer riêng
- 13. Tại sao ghi đè == phải ghi đè bằng?
- 14. Có thể sử dụng Danh sách <T> .Contains (...)?
- 15. Ghi đè phương thức ghi đè (C#)
- 16. Entity Framework 4.1: Ghi đè IEnumerable <ValidationResult> Validate
- 17. Sự khác biệt giữa ghi đè ảo, ghi đè, ghi đè mới và bị ghi
- 18. .NET, tệp máy chủ Windows, ghi đè dns qua mã
- 19. Cách "ghi đè" các phương thức mở rộng trong .NET?
- 20. Scala: Ghi đè một Generic Phương pháp Java mà trả về null
- 21. @OneToMany List <> vs Set <> khác biệt
- 22. C# List <> để xml
- 23. ArrayList vs List <> in C#
- 24. Initialize List <> với Arrays.asList
- 25. Có cách nào để ghi đè toán tử << trong Ruby không?
- 26. C#, Danh sách <T> .Contains() - quá chậm?
- 27. Gọi chức năng ghi đè từ chức năng ghi đè
- 28. Ghi đè đối tượng ghi đè với các liên kết
- 29. Ghi đè đăng ký ghi đè Tạo Phương thức
- 30. Generic <T> cách truyền?
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à? –
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ợ) .. –
@ 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)? –