C # Нахождение ближайшего значения в общем массиве? - PullRequest
0 голосов
/ 26 мая 2018

То же, что и: C # Поиск ближайшего числа в массиве , но не обязательно иметь числа

Я думаю о создании метода расширения, который будет выглядеть следующим образом:

public static TSource ClosestTo<TSource>(this IEnumerable<TSource> source
    , TSource target
    , IComparer<TSource> comparer = null)

Конечно, мы можем добавить конвертер из TSource в int и повторить int-совместимый алгоритм.

Но мне интересно, можно ли добиться того же самого только сравнениями, не прибегая к преобразованию int, чтобы иметь возможность использовать Math.Abs.

1 Ответ

0 голосов
/ 26 мая 2018

По сути, нет - эта подпись не предоставляет достаточно информации для определения «близости».

IComparer<T> позволяет сравнивать только два значения, чтобы определить, является ли одно больше, меньше или равно другому,Нет понятия «расстояние».

С этой подписью вы можете вернуть:

  • Значение, которое соответствует target
  • Значение, которое меньше target, но больше любого другого значения, которое меньше target
  • Значение, которое больше target, но меньше, чем любое другое значение, которое больше target

Предполагается, что source не содержит значений, равных друг другу.

Так, например, с учетом ввода {1, 6, 3, 7, 8, 10} и целииз 4, вы можете вернуть «3 и 6», но вы не можете сказать, что 3 ближе к цели, чем 6.

Обратите внимание, что значения могут быть сопоставимы, как это, без понятия "расстояние "вообще в IComparer<T> или IComparable<T>.Я не знаю ни о каком подобном интерфейсе, который имеет такое понятие.Например, вы можете сортировать строки по порядку, но будет ли расстояние между «лисой» и «вомбатом»?Вы могли бы потенциально построить некоторое представление о расстоянии, но может быть несколько конкурирующих, и я подозреваю, что вы столкнетесь с проблемами точности, так как используемые строки становятся все длиннее и длиннее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...