Предположим, у меня есть класс.net Четкие() и сложные условия использования
public class Audio
{
public string artist { get; set; }
public string title { get; set; }
// etc.
}
Теперь я хочу, чтобы отфильтровать дубликаты в списке таких аудио-х по сходству (не Четк.совп) условия. В основном это расстояние Левенштейна с коррекцией treshold по общей длине строки. Проблема в том, что общий совет о IEqualityComparer - «Всегда применять как GetHashCode, так и Compare». Я obviuosly не могу рассчитать расстояние между строками в GetHashCode, потому что это не метод сравнения вообще. Однако в этом случае даже аналогичные звуковые сигналы возвращают разные хэши, а Distinct() будут обрабатывать его как разные объекты, а метод compare() не запускается.
Я попытался заставить GetHashCode всегда возвращать 0, поэтому Compare вызывает каждый объект в коллекции, но это медленно. Итак, наконец, вопрос: есть ли что-нибудь, что я могу сделать с .net из коробки, или мне нужно найти хороший алгоритм фильтрации?
Я думаю, что вы можете злоупотреблять «Distinct» здесь. Например, вы можете рассматривать 'ab' как дубликат' bc' и 'bc' как дубликата' cd', но вы не считаете 'ab' дубликат' cd'. Это делает «Distinct» не работает для вас. – Gabe
Спасибо, Гейб, я об этом не думал. Я вижу, я должен просто прочитать хорошую книгу об алгоритмах поиска. – Tommi
Если у вас есть статический длинный список объектов - взгляните на деревья BK, они могут помочь вам в том, что вы пытаетесь выполнить. Я написал реализацию в F # один раз, это вполне применимо для вашей цели. Вы можете сохранить в нем любой объект, сравнить его с levenshtein на любом свойстве с помощью функции выбора. Если вам интересно, я могу загрузить код в битбакет. – rkrahl