[ad_1]
次の文字列を取得するための関数が必要ですが、ここではロジックが異なります。 入力アルファベット A を B に、B を C に Z までインクリメントしたいのですが、ZI の後に文字列 A1 を取得する必要があります。 文字列 A1 を入力として取得すると、Z1 まで B1、B1 から C1 にインクリメントする必要があります。 Z1 の後、A2 を取得する必要があります。 A2 を取得すると、それは B2 にインクリメントされ、Z9 まで続きます。 誰か助けてくれませんか。
以下のコードを使用してみましたが、入力 A1 を与えると間違った出力が返され、A2 として出力されます。
私が試したこと:
C#
public static string Increment(string input) { List<char> chars = input.ToList(); for (int i = chars.Count - 1; i >= 0; i++) { if (chars[i] < '1' || chars[i] > '9') { throw new ArgumentException(""); } chars[i]++; if (chars[i] > 'Z') { chars[i] = 'A'; if (i == 0) { chars.Add('1'); } } else { break; } } return string.concat(chars); }
解決策 1
試してください (このようなコードは堅牢ではないことに注意してください。適切なチェックを追加するのはあなた次第です)
C#
public static string Increment(string input) { Char letter = input[0]; if ( letter < 'Z') { return ((char)(letter+1)).ToString() + input.Substring(1); } else { int number = int.Parse(input.Substring(1))+1; return "A"+ number.ToString(); } }
解決策 3
Linq の使用:
C#
public static string GetNextCode(string current) { string tmp = current.Length == 1 ? $"{current}0" : current; char[] alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToArray(); char[] digit = "0123456789".ToArray(); var list = (from d in digit from a in alpha select $"{a}{d}") .ToList(); int i = list.IndexOf(tmp) +1; if(i>list.Count-1) throw new Exception("Limit of codes has been reached!"); else tmp = list[i]; return tmp.Substring(1,1).Equals("0") ? tmp.Substring(0,1) : tmp; }
使用法:
C#
void Main() { string currCode = "Z8"; string nextCode = GetNextCode(currCode); Console.WriteLine($"{currCode} => {nextCode}"); //prints "A9" }
解決策 2
あなたがしている質問は何ですか? 「誰か助けてくれませんか」以外に質問が見つかりません。
コードのロジックを再設計して、必要な出力を提供します。 出力が得られる理由がわからない場合は、コードを確認していません。 そうすることで、何が問題なのか、それを修正するために何をする必要があるのかがわかります。
[ad_2]
コメント