Trovare la lettera successiva ad un’altra

Lavorando con le griglie capita spesso di trovarsi in una situazione in cui le righe vengono rappresentate con dei numeri e le colonne con delle lettere. In un processo di automazione, mentre è semplice numerare i numeri appare più complessa l’operazione sulle lettere. Infatti, ad esempio, dopo la lettera Z si trova AB e così via…
Un procedimento come questo non funzionerà, poichè nella tabella ASCII il numero 27 corrisponde al simbolo “[“:

int number = 27;
Console.WriteLine((char)('A' + number));

Una soluzione semplice

Le varie soluzioni che si possono proporre si dividono fra quelle che includono un dizionario e quelle matematiche. Propongo la soluzione matematica scritta in C# che utilizza il concetto di resto:

		private string IntToLetters(int num)
		{
			string result = string.Empty;
			while (num >= 0)
			{
				result = (char)('A' + num % 26) + result;
				num /= 26; num--;
			}
			return num;
		}

Il metodo parte da 0 (dove A => 0) e procede all’infinito. Ovviamente è possibile anche effettuare l’operazione inversa, anche se la logica è un po’ più complessa:

		private static int LettersToInt(string value)
		{
			int result = 0;
			List<char> digits = new List<char>("ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray());
			char[] chars = value.ToUpper().ToCharArray();
			int weight = chars.Length;
			for (int position = 0; position < chars.Length; position++)
			{
				int currentVal = digits.FindIndex(x => x == chars[position]);
				weight = chars.Length - position;
				int r = (weight - 1) * (currentVal + 1) * 26 + currentVal;
				result += r;
			}
			return result;
		}

…Devo ammettere che ci ho messo un bel po’ per ricavare la funzione qui sopra 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *