首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在c# -最优解中生成具有指定间隔的数字

在c# -最优解中生成具有指定间隔的数字
EN

Stack Overflow用户
提问于 2013-11-14 13:18:18
回答 1查看 421关注 0票数 0

我试图生成这样的数字:

代码语言:javascript
复制
GetAllNumbersFrom(1, Equality.GreaterThan, 100, ",", 10)

会产生

代码语言:javascript
复制
1, 11, 21, 31, 41, 51, 61, 71, 81, 91,

编写的函数类似于以下内容:

代码语言:javascript
复制
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的线性最优函数可能是?把所有笨手笨脚的循环都去掉了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-14 13:31:56

您可以尝试如下:

代码语言:javascript
复制
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)。

有了计数,我们首先产生序列0,1,2,.计数-1与Enumerable.Range。然后,我们使用线性函数对其进行转换:将第一个数字移到first并调整步长。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19978690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档