2016-12-22 2 views
1
int [] testArray = new int[3] { 5, 7, 8}; 

int check = 22; 

var nearest = testArray.Min(x => Math.Abs(x - check)); 

Debug.Print(Convert.ToString(nearest)); 

У меня есть код выше как попытка попытаться получить ближайший номер в массиве, ближайшем к контрольному номеру, в этом случае 22.Получить наиболее близкое значение в массиве

Дела в том, что это всегда возвращает положительное значение из-за Math.Abs, но если я удалю это, код полностью не удастся. например, если номер проверки равен 10, я хочу, чтобы ближайший к возврату -2, а не 2. Таким образом, я могу просто добавить ближайшее значение к номеру проверки, чтобы получить правильное значение, находящееся в массиве.

я нашел что-то похож на поиск, что называется MoreLinq, что предложил использовать вместо array.MinBy, однако этот метод выдает ошибку (говорит, что это не существует) ... Спасибо

+1

Вы хотите получить номер в массиве, который наиболее близка к вашему номеру или расстоянию до этого номера? Название предполагает, что вы хотите, чтобы 22 приводило к 8 в результате, однако ваши объяснения и код выглядят скорее как ожидающие (-) 14. – wkl

+0

MoreLinq - это расширение Linq. Вы можете получить его от менеджера пакетов nuget. Проверьте https://morelinq.github.io/ – Tejus

+0

@wkl идея состоит в том, чтобы получить 8, однако я пытался достичь этого, сначала получив расстояние, а затем добавив его к исходному числу, чтобы получить его в массиве. –

ответ

3

Я хотел бы предложить первый заказ на мин и взять первое значение. Это ваше ближайшее значение, и вы можете сделать с ним то, что хотите. Например вычислить nearest-check

int[] testArray = new int[3] { 5, 7, 8 }; 

int check = 22; 

var nearest = testArray.OrderBy(x => Math.Abs(x - check)).First(); 

Debug.Print(Convert.ToString(nearest-check)); 
+0

Спасибо, немного подделал его и отлично работал. Еще раз спасибо. –

+0

Это элегантно :-) –

0

Попробуйте testArray.Aggregate((min, next) => Math.Abs(next - check) > Math.Abs(min - check) ? min : next). Он должен быть быстрее, чем OrderBy().

0

Если исходный массив гарантированно будет отсортирован, вы можете использовать Array.BinarySearch. Я гарантирую, что он будет быстрее, чем любое решение LINQ, которое вы можете найти.

int[] arr = { 3, 5, 7 }; 
int idx = Array.BinarySearch(arr, 3); 
int closest = idx < 0 ? arr[~idx] : arr[idx];