Giả sử tôi có một lớp.net biệt() và phức tạp điều kiện ở
public class Audio
{
public string artist { get; set; }
public string title { get; set; }
// etc.
}
Bây giờ tôi muốn lọc các bản sao trong danh sách của âm thanh như vậy bởi sự giống nhau (trận đấu không chính xác) điều kiện. Về cơ bản, nó là khoảng cách Levenstein với hiệu chỉnh ngưỡng bằng tổng chiều dài chuỗi. Vấn đề là, mẹo chung về IEqualityComparer là "Luôn triển khai cả GetHashCode và So sánh". Tôi obviuosly không thể calc khoảng cách giữa các chuỗi trong GetHashCode vì nó không phải là một phương pháp so sánh ở tất cả. Tuy nhiên trong trường hợp này, ngay cả âm thanh tương tự sẽ trả về các hash khác nhau và Distinct() sẽ coi nó là các đối tượng khác nhau và phương thức compare() không được kích hoạt.
Tôi đã cố gắng bắt buộc GetHashCode luôn trả về 0, vì vậy So sánh được gọi cho từng đối tượng trong bộ sưu tập, nhưng điều này là chậm. Vì vậy, cuối cùng, một câu hỏi: là có bất cứ điều gì tôi có thể làm với .net ra khỏi hộp hoặc tôi nên tìm kiếm một số thuật toán tốt để lọc?
Tôi nghĩ bạn có thể đang lạm dụng 'Phân biệt' ở đây. Ví dụ, bạn có thể coi 'ab' là một bản sao của' bc' và 'bc' là một bản sao của' cd', nhưng bạn sẽ không coi 'ab' là một bản sao của' cd'. Điều này làm cho 'Distinct' không hoạt động cho bạn. – Gabe
Cảm ơn, Gabe, tôi đã không nghĩ về nó. Tôi thấy tôi nên đọc một cuốn sách hay về các thuật toán tìm kiếm. – Tommi
Nếu bạn có danh sách các đối tượng tĩnh, dài - hãy xem BK Trees, chúng có thể giúp bạn rất nhiều trong những gì bạn đang cố gắng hoàn thành. Tôi đã viết thực hiện trong F # một lần, nó hoàn toàn có thể sử dụng cho mục tiêu của bạn. Bạn có thể lưu trữ bất kỳ đối tượng nào trong đó, so sánh nó với levenshtein trên bất kỳ thuộc tính nào bằng chức năng chọn. Nếu bạn quan tâm, tôi có thể tải mã lên bitbucket. – rkrahl