Преобразование / округление числа до ближайшего совпадения в диапазоне, где все они смещены на 30, получая его верхние и нижние значения?

1

Прежде всего, я не уверен, правильно ли сформулировал свой вопрос, но то, что я ищу, можно лучше объяснить, посмотрев на следующее визуальное представление:

У меня есть метод, который возвращает int в диапазоне от 0 до 360.

Теперь, для дальнейших манипуляций, я хотел бы round? или получить самое близкое соответствие от чисел, которые смещены на 30. Так как я могу достичь этого. Кроме того, существует ли specific term для функции, которую я ищу?

Вы также можете отредактировать вопрос, если считаете, что его можно написать лучше.

С наилучшими пожеланиями, Навик. Изображение 174551

Теги:
matching
numbers
int

1 ответ

0
Лучший ответ

Это должно работать для любого списка, где элементы находятся на равном расстоянии друг от друга (т.е. 30, 60, 90).

РЕДАКТИРОВАТЬ

Я обновил код, чтобы использовать элегантное решение AlexD, чтобы оно работало со списками любого значения шага и с любым стартовым (или окончательным) значением (то есть оно могло начинаться с отрицательного числа, например: -20, -15, -10, -5, 0, 5, 10, 15, 20):

/// <summary>
/// Gets the value of the item in the list of
/// numbers that is closest to the given number
/// </summary>
/// <param name="number">Any number</param>
/// <param name="numbers">A list of numbers, sorted from lowest to highest,
/// where the difference between each item is the same</param>
/// <returns>The value of the list item closest to the given number</returns>
public static int GetClosestNumber(int number, List<int> numbers)
{
    if (numbers == null) throw new ArgumentNullException("numbers");
    if (numbers.Count == 0)
        throw new
            ArgumentException("There are no items to compare against.", "numbers");
    if (numbers.Count == 1) return numbers[0]; // Short-circuit for single-item lists

    var step = Math.Abs(numbers[1] - numbers[0]);

    // Get closest number using a slight modification of AlexD elegant solution
    var closestNumber = (Math.Abs(number) + (step / 2)) / step * 
        step * (number < 0 ? -1 : 1);

    // Ensure numbers is within min/max bounds of the list
    return Math.Min(Math.Max(closestNumber, numbers[0]), numbers[numbers.Count - 1]);
}
  • 0
    Здравствуйте, Руфус, прежде всего, спасибо за ответ на вопрос. Сейчас я не смогу попробовать, но скоро попробую ваше предложение. Кроме того, когда вы произносите какой-либо список, это означает, что мое смещение изменилось с 30 на 6, а диапазон стал 6, 12, 18...354, 360 . Будет ли это работать?
  • 0
    Кроме того, если бы вы могли восстановить мой вопрос, чтобы понять, что мне нужно, это было бы здорово!
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню