我有一系列这样的整数:[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;
}
Run Code Online (Sandbox Code Playgroud)
它有效,但有没有更好/更快的方法呢?该数组永远不会包含超过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;
}
Run Code Online (Sandbox Code Playgroud)
使用LINQ可以使这更简单:
// Make sure we return "size" if none of the valid sizes are greater
return validSizes.Concat(new[] { size })
.First(validSize => validSize >= size);
Run Code Online (Sandbox Code Playgroud)
如果没有这个Concat步骤,它会更简单......或者如果有一个Concat方法只需要一个元素.诚然,这很容易写:
public static IEnumerable<T> Concat(this IEnumerable<T> source,
T tail)
{
foreach (T element in source)
{
yield return element;
}
yield return tail;
}
Run Code Online (Sandbox Code Playgroud)
那就是:
return validSizes.Concat(size).First(validSize => validSize >= size);
Run Code Online (Sandbox Code Playgroud)
或者(我意识到我提出了比这里真正需要更多的选项!)一个重载,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;
}
Run Code Online (Sandbox Code Playgroud)
像这样称呼它:
return validSizes.FirstOrDefault(validSize => validSize >= size, size);
Run Code Online (Sandbox Code Playgroud)
这两种方法都是一次性使用,但如果您已经构建了一个额外的LINQ运算符库,它可能会很有用.