我正在尝试生成这样的数字:
GetAllNumbersFrom(1, Equality.GreaterThan, 100, ",", 10)
会生成
1, 11, 21, 31, 41, 51, 61, 71, 81, 91,
写的函数类似于:
public static List<string> GetAllNumbersFrom(int i, Equality equality, int limit, string appendBy, int incrementBy = 5)
{
var greaterThanGivenOrEqualTo = new List<string>();
var smallerThanGivenOrEqualTo = new List<string>();
if (equality == Equality.GreaterThanOrEqualTo)
{
for (var count = i; count <= limit; count = count + incrementBy)
{
greaterThanGivenOrEqualTo.Add(count + appendBy);
}
}
else if (equality == Equality.LesserThanOrEqualTo)
{
for (var count = i; count >= limit; count = count - incrementBy)
{
smallerThanGivenOrEqualTo.Add(count + appendBy);
}
}
else if (equality == Equality.GreaterThan)
{
for (var count = i; count < limit; count = count + incrementBy)
{
greaterThanGivenOrEqualTo.Add(count + appendBy);
}
}
else
{
for (var count = i; count > limit; count = count - incrementBy)
{
smallerThanGivenOrEqualTo.Add(count + appendBy);
}
}
return equality == Equality.GreaterThanOrEqualTo
? greaterThanGivenOrEqualTo
: equality == Equality.GreaterThan
? greaterThanGivenOrEqualTo
: smallerThanGivenOrEqualTo;
}
但是,我确信必须有一个比我写的更简单的版本。一个5-10的线性最佳功能可能是?没有所有笨拙的if循环?
答案 0 :(得分:2)
您可以尝试以下操作:
string GetAllNumbersFrom(int first, int last, int step, string separator)
{
if (step == 0)
throw new ArgumentException("zero step");
if (Math.Sign(last - first) * Math.Sign(step) < 0)
throw new ArgumentException("Cannot reach last in this direction");
int count = Math.Abs((last - first) / step) + 1;
var numbers = Enumerable.Range(0, count).Select(n => first + step * n);
return string.Join(separator, numbers);
}
说明:首先,我们计算输出列表中的数字:它是数字之间的距离除以步长(加上起始数字为1)。
有了计数,我们首先使用Enumerable.Range生成序列0,1,2,... count-1。然后,我们使用线性函数对其进行转换:将第一个数字移到first
并调整步骤。