选择相对于另一个数字的数字

时间:2013-07-25 15:30:11

标签: dart

是否有更好的方法(不需要速度,简洁和简单)在更少的代码行中实现以下目标? (以下示例)

//    Example //
/*
 * Get Divisor For Number of Iterations - To Display Progress
*/
int fGetDivisor(int iMaxIters) {  
  int iDiv = 500;   // init
  if (iMaxIters >= 100000)
    iDiv = 20000;
  else if (iMaxIters > 20000)
    iDiv = 10000;
  else if (iMaxIters > 5000)
    iDiv = 2000;
  else if (iMaxIters > 2000)
    iDiv = 1000;

  return iDiv;
}

4 个答案:

答案 0 :(得分:3)

使用a ? b : c

int fGetDivisor(int iMaxIters) =>
    iMaxIters >= 100000 ? 20000 :
    iMaxIters >   20000 ? 10000 :
    iMaxIters >    5000 ?  2000 :
    iMaxIters >    2000 ?  1000 :
                            500 ;

或者Map<int,int>仅在一个地方有条件:

import 'dart:collection';

int fGetDivisor(int iMaxIters) {
  final map = new LinkedHashMap<int,int>()
    ..[99999] = 20000
    ..[20000] = 10000
    ..[ 5000] =  2000
    ..[ 2000] =  1000
    ;
  for (final step in map.keys) {
    if (iMaxIters > step) return map[step];
  }
  return 500;
}

答案 1 :(得分:3)

坦率地说,我认为那些firstWhere使它变得更加复杂。

这是我能提出的最简单的方法:

int fGetDivisor(int iMaxIters) {
  if (iMaxIters >= 100000) return 20000;
  if (iMaxIters > 20000) return 10000;
  if (iMaxIters > 5000) return 2000;
  if (iMaxIters > 2000) return 1000;
  return 500;
}

答案 2 :(得分:2)

通常对于这种类型的代码,我喜欢使用键列表和值列表。 firstWhere方法也可以帮助我们:

int fGetDivisor(int iMaxIters) {
  var keys = [99999, 20000, 5000, 2000];
  var vals = [20000, 10000, 2000, 1000];

  var key = keys.firstWhere((e) => iMaxIters > e, orElse: () => null);
  return key == null ? 500 : vals[keys.indexOf(key)];
}

此方法还可以轻松添加要检查的新值。

答案 3 :(得分:1)

int fGetDivisor(int iMaxIters) =>
  [[999999, 20000], [20000, 10000], [5000, 2000], [2000, 1000]]
    .firstWhere((x) => iMaxIters > x[0], orElse: () => [0, 500])[1];