我有一个像这样的整数数组:[32,128,1024,2048,4096]
给定一个特定值,我需要获取数组中等于或大于该值的最接近值。
我有以下代码
private int GetNextValidSize(int size, int[] validSizes)
{
int returnValue = size;
for (int i = 0; i < validSizes.Length; i++)
{
if (validSizes[i] >= size)
{
returnValue = validSizes[i];
break;
}
}
return returnValue;
}
它有效,但是有更好/更快的方法吗?该数组永远不会包含超过 5-10 个元素。
澄清:如果原始值/大小大于任何有效大小,我实际上想返回它。 validSizes 数组可以被认为总是排序的,它总是至少包含一个值。
最佳答案
只有 5-10 个元素,绝对是最简单的解决方案。让二进制印章正常工作将有助于处理更大的数组,但它至少有 可能 出现差一错误。
不过,我不会中断,而是直接从循环返回以使其更简单,并且也使用 foreach:
private int GetNextValidSize(int size, int[] validSizes)
{
int returnValue = size;
foreach (int validSize in validSizes)
{
if (validSize >= size)
{
return validSizes;
}
}
// Nothing valid
return size;
}
您可以使用 LINQ 使这更简单:
// Make sure we return "size" if none of the valid sizes are greater
return validSizes.Concat(new[] { size })
.First(validSize => validSize >= size);
如果没有 Concat
步骤,或者如果有一个只采用单个元素的 Concat
方法,它会更简单。诚然,这很容易写:
public static IEnumerable<T> Concat(this IEnumerable<T> source,
T tail)
{
foreach (T element in source)
{
yield return element;
}
yield return tail;
}
那就是:
return validSizes.Concat(size).First(validSize => validSize >= size);
或者(我意识到我提供的选项比这里真正需要的多得多!)FirstOrDefault
的重载,它采用默认值返回:
public static T FirstOrDefault(this IEnumerable<T> source,
Func<T, bool> predicate,
T defaultValue)
{
foreach (T element in source)
{
if (predicate(element))
{
return element;
}
}
return defaultValue;
}
这样调用它:
return validSizes.FirstOrDefault(validSize => validSize >= size, size);
这两种方法对于单次使用来说都太过分了,但如果您已经在构建一个包含额外 LINQ 运算符的库,它可能会有用。
关于c# - 将整数舍入到数组中最接近的高数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1143451/