我所做的是从列表中选择一个随机项目。然后我需要根据列表中的总项目等待一个随机间隔。
例如;如果列表中有20个项目,请等待1秒到2秒之间。 如果列表中有10个项目,请在1到3秒之间等待更高的值。 如果列表中有1个或2个项目,请等待5到10秒之间的某个时间。 这些数字我刚刚编写,但你得到了要点。更多项目=选择更快的等待时间;更少的物品,选择更长的等待时间。
我想知道是否有更优雅的方式在.NET中执行此操作,而无需使用800 if块来实现此目的。
答案 0 :(得分:1)
看起来您需要将值(可能从值范围)映射到结果(对上/下限)。如果您有少量可能的值,或者在范围列表中进行二进制搜索,则可以使用直接lookup table来完成:
直接查找的完整范围列表:
int itemCount = 2; // make sure it less than number of elements in ranges.
var random = new Random();
var ranges = new Tuple<int, int>[] {
Tuple.Create(0, 1), // value for 0
Tuple.Create(5, 10), // value for 1 item
Tuple.Create(5, 10), // value for 2 items
Tuple.Create(1, 2), // value for 3 items
};
var value = random.NextDouble() * ranges[itemCount].Item1 +
ranges[itemCount].Item2 - ranges[itemCount].Item1;
“功能”的值发生变化的点数列表:
int itemCount = 5;
var random = new Random();
var ranges = new Tuple<int, double, double>[] {
Tuple.Create(2, 5.0, 10.0), // value for 0-2 items
Tuple.Create(2, 5.0, 10.0), // value for 2-10 items
Tuple.Create(10, 1.0, 3.0), // value for 10-20 items
Tuple.Create(20, 1.0, 2.0), // value for 20+ items
};
// linear search through table, replace with binary search for 10+ items
var range = ranges[0];
for (var i = 0; i < ranges.Length;i++)
{
if (ranges[i].Item1 >= itemCount)
break;
range = ranges[i];
}
var value = random.NextDouble() * range.Item2 + range.Item3 - range.Item2;