C# 通过获取数字的上限值和下限值,将数字转换/四舍五入到其偏移30的范围内最接近的匹配?

C# 通过获取数字的上限值和下限值,将数字转换/四舍五入到其偏移30的范围内最接近的匹配?,c#,numbers,int,matching,C#,Numbers,Int,Matching,首先,我不确定我的问题是否框架正确,但通过查看下面的视觉表示可以更好地解释我所寻找的: 我有一个方法,它返回0到360范围内的int 现在,为了进一步操纵,我想轮?或者从偏移30的数字中获得最接近的匹配。那么我怎样才能做到这一点呢。还有,我要寻找的函数是否有一个特定的术语 如果你认为问题可以写得更好,你也可以编辑它 致以最良好的祝愿, 纳维克。 这适用于所有项目间距相等的列表,即30、60、90 编辑 我已经更新了代码以使用AlexD的优雅解决方案,这样它可以处理任何“步长”值的列表,以及任何起

首先,我不确定我的问题是否框架正确,但通过查看下面的视觉表示可以更好地解释我所寻找的:

我有一个方法,它返回0到360范围内的int

现在,为了进一步操纵,我想轮?或者从偏移30的数字中获得最接近的匹配。那么我怎样才能做到这一点呢。还有,我要寻找的函数是否有一个特定的术语

如果你认为问题可以写得更好,你也可以编辑它

致以最良好的祝愿, 纳维克。

这适用于所有项目间距相等的列表,即30、60、90

编辑

我已经更新了代码以使用AlexD的优雅解决方案,这样它可以处理任何“步长”值的列表,以及任何起始值或结束值,即它可以以负数开始,例如:-20,-15,-10,-5,0,5,10,15,20:


你好,鲁弗斯,首先,谢谢你回答这个问题。我现在不能试一试,但我很快就会试试你的建议。另外,当你说任何列表时,是否意味着-如果我的偏移量从30变为6,范围变为6,12,18…354360。它还能用吗?而且,如果你能重新构造我的问题,能够理解我需要什么,那就太好了!是的,这就是我的意思,如果你传入一个数字列表,比如0、6、12、18,传入8,它将返回6,传入9,它将返回12。@NavikGoswami我使用修改过的AlexD解决方案更新了代码,使其可以处理任何步长值和任何开始/结束值。我还添加了一个xml摘要,描述了它的功能。希望这能回答你的问题?
/// <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's 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]);
}