数组中的舍入整数到最接近的高数

Obi*_*obi 1 c# arrays

我有一系列这样的整数:[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数组始终是排序的,并且它始终包含至少一个值.

Jon*_*eet 8

只有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运算符库,它可能会很有用.


tan*_*ius 7

鉴于你只有5-10个元素我会认为这没关系.