2010-04-12 5 views
1

J'essaye de convertir un index de 1 à 27 dans la lettre majuscule correspondante. Je sais que dans C++ je pouvais taper ceci:Comment convertir des entiers en caractères en C#?

char letter = 'A' + (char)(myIndex % 27); 

Ce même code ne fonctionne pas en C#. Comment puis-je accomplir cette tâche en C#?

EDIT: Je préfère ne pas avoir à encoder une instruction enum ou switch pour cela s'il existe une meilleure solution mathématique comme celle ci-dessus.

+0

char letter = Convert.ToChar (monIndex); –

Répondre

8

Lorsque vous ajoutez (ou soustrayez) deux caractères, yo Vous obtenez un Int32 en C#. Cela fonctionne:

int letter = 'A' + (char)(myIndex % 27); 

Si vous voulez un char, vous devez jeter à nouveau explicitement:

char letter = (char) ('A' + (char)(myIndex % 27)); 

Cependant, ce très probablement devrait en fait être:

char letter = (char) ('A' + (char)((myIndex - 1) % 26)); 
+1

vous devriez s/27/26/g – Vlad

+0

Oui, mais je voulais faire l'équivoque du code OP. –

+0

@Vlad: Tu aimes ça mieux? –

4
char letter = (char)('A' + (myIndex-1)%26); 

(modifier en nombre magique, indices corrigés des variations)

+0

Désolé, -1 pour les nombres magiques –

+0

Oh, c'est vrai. '% 26'. Merci. Je suppose que je rendais celui-ci plus difficile que nécessaire. –

2

En C#, vous aurez à faire votre casting un peu différemment:

char letter = (char)('A' + (myIndex % 27)); 

Cependant, vos calculs pourrait aussi se tromper, et c'est probablement plus proche de ce que vous voulez réellement:

char letter = (char)('A' + ((myIndex - 1) % 26)); 
+0

% 27 est faux, devrait être 26 :-) Il n'y a que 26 lettres en alphabet latin. – Vlad

+0

J'ai un peu copié cela à partir du code original ... il dit qu'il a un index de 1 à 27 de toute façon. Bien sûr, pour obtenir la bonne lettre latine, il devrait le faire ('A' + (char) ((myIndex - 1)% 26)) –

+0

En effet, je vois. Avec 26 devrait mieux fonctionner. – Vlad

0

Cela devrait travailler ...

byte upperA = 65; 
byte index = 1; 

char letter = (char)(upperA + (index % 27)); 

Console.WriteLine(letter); 

J'ai aussi comme la réponse de Reed.

6

Voici une table solution orientée:

char ToUpperChar(int index) 
{ 
    if (index < 1 || index > 26) 
     throw new ArgumentOutOfRangeException("index"); 

    return "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[index-1]; // took out the % - it's range-checked above. 
} 
+0

+1 pour une approche plus originale. tant de moulages de types devenaient ennuyeux;) Et c'est purement mathématique puisque l'indexation de tableau est le sucre de syntaxe pour l'arithmétique de pointeur. –

1

Que diriez-vous d'une méthode d'extension?

public static int Index(this char letter) 
    { 
     const int offset = 64; 
     if(letter >= 'A' && letter <= 'Z') 
      return (Convert.ToInt32(letter) - offset); 
     return 0; 
    } 

// Utilisation ... ombles lettre = 'A'; int index = lettre.Index();

+0

Désolé! Fausse route. Essaye ça... char statique public CharToIndex (ce nombre entier) { const int offset = 64; si (nombre> = 1 && nombre <= 26) return (Convert.ToChar (nombre + décalage)); Renvoie '\ 0'; } // Utilisation ... int i = 1; char c = i.CharToIndex(); – soulia

Questions connexes