Прежде всего, я не уверен, правильно ли сформулировал свой вопрос, но то, что я ищу, можно лучше объяснить, посмотрев на следующее визуальное представление:
У меня есть метод, который возвращает int
в диапазоне от 0
до 360
.
Теперь, для дальнейших манипуляций, я хотел бы round?
или получить самое близкое соответствие от чисел, которые смещены на 30. Так как я могу достичь этого. Кроме того, существует ли specific term
для функции, которую я ищу?
Вы также можете отредактировать вопрос, если считаете, что его можно написать лучше.
С наилучшими пожеланиями, Навик.
Это должно работать для любого списка, где элементы находятся на равном расстоянии друг от друга (т.е. 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]);
}
6, 12, 18...354, 360
. Будет ли это работать?