-8

シーケンスは次のようになります。
AZ,AA-AZ,BA-BZ,CA-CZ,.......,ZA-ZZ ZZ の
はAAAから。 次に、AAAからZZZに、次にAAAAからZZZZに、というように続きます。

このシーケンスは、Excel シートのシーケンスとほとんど同じです。

編集:私のコードを追加しました

        private void SequenceGenerator()
    {
        var numAlpha = new Regex("(?<Numeric>[0-9]*)(?<Alpha>[a-zA-Z]*)");
        var match = numAlpha.Match(txtBNo.Text);

        var alpha = match.Groups["Alpha"].Value;
        var num = Convert.ToInt32(match.Groups["Numeric"].Value);
        lastChar = alpha.Substring(alpha.Length - 1);

        if (lastChar=="Z")
        {
            lastChar = "A";
            txtBNo.Text = num.ToString() + "A" + alpha.Substring(0, alpha.Length - 1) + lastChar;
        }

        else
        {
            txtBNo.Text = num.ToString() + alpha.Substring(0, alpha.Length - 1) + Convert.ToChar(Convert.ToInt32(Convert.ToChar(lastChar)) + 1);
        }
    }

これは私がやったことです。しかし、私はそれが間違った論理であることを知っています。

ありがとう。

4

3 に答える 3

8

コメントに書いたように、これはベース変換の問題であり、出力はbase-26で、シンボルAZ

static string NumToLetters(int num)
{
    string str = string.Empty;

    // We need to do at least a "round" of division
    // to handle num == 0
    do
    {
        // We have to "prepend" the new digit
        str = (char)('A' + (num % 26)) + str;
        num /= 26;
    }
    while (num != 0);

    return str;
}
于 2015-03-12T08:21:27.893 に答える
1

この方法を試してください:

public static IEnumerable<string> GenerateItems()
{
    var buffer = new[] { '@' };
    var maxIdx = 0;
    while(true)
    {
        var i = maxIdx;
        while (true)
        {
            if (buffer[i] < 'Z')
            {
                buffer[i]++;
                break;
            }

            if (i == 0)
            {
                buffer = Enumerable.Range(0, ++maxIdx + 1).Select(c => 'A').ToArray();
                break;
            }

            buffer[i] = 'A';
            i--;
        }

        yield return new string(buffer);
    }
    // ReSharper disable once FunctionNeverReturns
}

これは、必要なアルファベット順の無限ジェネレーターです。次のようにアイテムの数を制限する必要があります。

var sequence = GenerateItems().Take(10000).ToArray();

次のように呼び出さないでください (無限ループが発生します)。

foreach (var i in GenerateItems())
    Console.WriteLine(i);
于 2015-03-12T09:22:53.217 に答える