У меня есть метод C#, который проектирует значение числа от интервала до целевого интервала.
Например: у нас есть интервал -1000 и 9000 и значение 5000; если мы хотим, чтобы проецировать это значение интервала 0..100 мы получаем 60.Сделать алгоритм C# более эффективным
Вот метод:
/// <summary>
/// Projects a value to an interval
/// </summary>
/// <param name="val">The value that needs to be projected</param>
/// <param name="min">The minimum of the interval the value comes from</param>
/// <param name="max">The maximum of the interval the value comes from</param>
/// <param name="intervalTop">The minimum of the interval the value will
/// be projected to</param>
/// <param name="intervalBottom">The maximum of the interval the value will
/// be projected to</param>
/// <returns>Projected value</returns>
public decimal ProjectValueToInterval(decimal val,
decimal min,
decimal max,
decimal intervalBottom,
decimal intervalTop)
{
decimal newMin = Math.Min(0, min);
decimal valueIntervalSize = Math.Abs(max - newMin);
decimal targetIntervalSize = Math.Abs(intervalTop - intervalBottom);
decimal projectionUnit = targetIntervalSize/valueIntervalSize;
return (val * projectionUnit) + Math.Abs((newMin * projectionUnit));
}
Этот метод должен быть вызван для тысяч значений.
Мне было интересно, есть ли более эффективный способ сделать это на C#? Если да, какие изменения вы предлагаете?
Почему "decimal newMin = Math.Min (0, min);"? Разве это не дает вам неправильный ответ за любой положительный минимум? – VVS 2008-12-04 10:16:28
Вы правы, Math.Min (0, min) делает значения в диапазоне от 0; Я забыл это вынести, но это не влияет на вопрос ... – Germstorm 2008-12-04 13:27:56