c# - 将整数舍入到数组中最接近的高数

标签 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;
  }

它有效,但是有更好/更快的方法吗?该数组永远不会包含超过 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/

相关文章:

c# - 如何以编程方式调整 Tab 控件的大小?

c++ - 整数到二进制存储在数组中

c# - Rabbit-Mq在被拒绝后没有路由到死信队列

javascript - 从数组中删除值,使用新数组总计更新 html,如果没有总计,则更新 '$'

arrays - 如何返回作为数组子类型的类型参数?

arrays - 如何将 String[] 转换为 Map,并将数组索引作为 java lambda 中的求和值?

java - 查找字符串中的字符

c# - 通用存储库模式中的主键属性名称不同

c# - 如何设置图像上下文菜单项的图标

c# - UDP 套接字 : recvfrom() returns -1 (SOCKET_ERROR)