2文字または3文字の長さの文字列ベースのコードがあり、それをインクリメントする関数を作成するためのヘルプを探しています。
コードの各「桁」の値は0から9、AからZです。
いくつかの例:
シーケンスの最初のコードは000です
009-次のコードは-00A00D-次
のコードは-00EAAZ-次のコードは-AB0
最後のコードはZZZです。
これが理にかなっていることを願っています。
カウンターをintとして維持し、これをインクリメントします。モッディングと36での除算を繰り返して、intを文字表現に変換します。変更された範囲(0-35)を0-Zにマップします。
例
どちらの方向にも進むように関数を更新しました:
internal class Program
{
const int Base = 36;
public static void Main()
{
Console.WriteLine(ToInt("0AA"));
Console.WriteLine(ToString(370));
}
private static string ToString(int counter)
{
List<char> chars = new List<char>();
do
{
int c = (counter % Base);
char ascii = (char)(c + (c < 10 ? 48 : 55));
chars.Add(ascii);
}
while ((counter /= Base) != 0);
chars.Reverse();
string charCounter = new string(chars.ToArray()).PadLeft(3, '0');
return charCounter;
}
private static int ToInt(string charCounter)
{
var chars = charCounter.ToCharArray();
int counter = 0;
for (int i = (chars.Length - 1), j = 0; i >= 0; i--, j++)
{
int chr = chars[i];
int value = (chr - (chr > 57 ? 55 : 48)) * (int)Math.Pow(Base, j);
counter += value;
}
return counter;
}
変換コードのその他のバリエーションについては、基数10の数値を.NETの任意の基数に変換する最も簡単な方法を参照してください。。
アドバイスをありがとう。
これは私が独自に思いついたものです。
private static String Increment(String s)
{
String chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char lastChar = s[s.Length - 1];
string fragment = s.Substring(0, s.Length - 1);
if (chars.IndexOf(lastChar) < 35)
{
lastChar = chars[chars.IndexOf(lastChar) + 1];
return fragment + lastChar;
}
return Increment(fragment) + '0';
}
それが良いか悪いかはわかりませんが、うまくいくようです。誰かが改善を提案できるなら、それは素晴らしいことです。
これはあなたが必要とすることをしますか?
public class LetterCounter
{
private static readonly string[] _charactersByIndex = new string[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };
public string GetStr(int i)
{
if (i < _charactersByIndex.Length)
return _charactersByIndex[i];
int x = i / (_charactersByIndex.Length - 1) - 1;
string a = _charactersByIndex[x];
string b = GetStr(i - (_charactersByIndex.Length - 1));
return a + b;
}
}
}
@Martinの回答に基づいて、2つのZZが来るとエラーが見つかりました。これにより、コードで例外が発生します。
private static String Increment(String s,bool IsFromRecursion=false)
{
String chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
//Added this condition
if (IsFromRecursion && string.IsNullOrEmpty(number))
{
return "1";
}
//Added this condition
char lastChar = s[s.Length - 1];
string fragment = s.Substring(0, s.Length - 1);
if (chars.IndexOf(lastChar) < 35)
{
lastChar = chars[chars.IndexOf(lastChar) + 1];
return fragment + lastChar;
}
return Increment(fragment,true) + '0';
}
このメソッドを呼び出すときは、最初のパラメーターのみを渡します。