0

私はこのような数字を生成しようとしています:

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 ループはありませんか?

4

1 に答える 1

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、ステップを調整します。

于 2013-11-14T13:31:56.570 に答える