Je cherche le code qui peut générer un tableau où le premier élément est Quelle est la meilleure façon de le faire en C #? P>
10 Réponses :
consultez un ASCII Table et prenez note des valeurs des caractères. Vous devriez être capable de travailler une boucle pour incrémenter le caractère d'A à Z pendant autant de fois que vous devez reproduire les caractères. :) p>
Vous pouvez générer des chiffres à l'aide de énumérable.range code> et de les jeter à char code> pour générer A-Z. La prochaine étape consiste à les combiner. P>
L'une des voies est la suivante:
foreach (var s in generate().Take(200)) Console.WriteLine(s);
C'est si simple et élégant c'est effrayant :)
Je retournerais nouvelle chaîne (nouveau [] {c, d}) code> dans le deuxième cas
@Snowbear: Oui, votre chemin est plus élégant, je vais le changer.
Ce n'est pas la base 26, car aa code> n'est pas le même que A code>. Voir aussi Stackoverflow.com/Questtions/763691/... où plusieurs réponses ont également donné une opération inverse.
@Svante: Oui, mais c'est assez proche de. Le nom est légèrement trompeur, je suis d'accord. (L'opération inverse est également triviale.)
a trouvé cela en si bien que dans PHP. Cela aiderait-il? ALGORITHM pour obtenir le nom de colonne de type Excel de un numéro p>
var q = Enumerable.Range(Convert.ToInt32('A'),26).Select( x => Convert.ToChar(x) );
var result = (
q.Select( x => x.ToString() )
.Concat(
q.SelectMany(
x => q.Select( y => x.ToString() + y.ToString() )
)
)
);
LINQ doit être utilisé pour rendre le code lisible, pour ne pas faire de code Linqish
Je pense que c'est parfaitement bien comme une expression fonctionnelle de ce qu'il demandait. Vlad est plus agréable à regarder, vrai, mais seulement parce que le compilateur cache tout le Cruft Cela crée de faire ce travail.
class Program
{
public static string IntegerToExcelColumn(int col)
{
// I've put a 256 upper bound here because Excel 2003
// allows only 256 columns. Change it if you're using
// Excel 2007 or 2010.
Debug.Assert(col >= 1 && col <= 256);
if (col >= 1 && col <= 26)
{
return ((char)(((int)'A') + (col - 1))).ToString();
}
// I've put a 256 upper bound here because Excel 2003
// allows only 256 columns. Change it if you're using
// Excel 2007 or 2010.
if (col > 26 && col <= 256)
{
int rem = col % 26;
int pri = col / 26;
if (rem == 0)
{
rem = 26;
pri--;
}
char[] buffer = new char[2];
buffer[0] = (char)(((int)'A') + (pri - 1));
buffer[1] = (char)(((int)'A') + (rem - 1));
return new string(buffer);
}
return "";
}
static void Main(string[] args)
{
string[] columns= new string[255];
for (int i = 1; i <= 255; i++)
columns[i-1] = IntegerToExcelColumn(i);
foreach(var col in columns)
Console.WriteLine(col);
}
}
Voici un moyen. :)
Une excellente réponse de VLAD.
Voici une autre variation de celle-ci: p> Si cela ne vous dérange pas de démarrer la séquence avec une chaîne vide que vous pouvez l'écrire comme suit: p>
Wow, belle usage de récursion infinie! J'aimerais avoir inventé cela. Il pourrait être encore plus simple si remplace la première boucle avec juste retour de rendement ""; code>.
Vous pouvez aussi essayer ceci. A à zz
Pour compléter la réponse de VLAD, voici l'opération inverse de TOBASE26 (INT):
static long ToBase10(string str)
{
if (string.IsNullOrWhiteSpace(str)) return 0;
var value = str[0] - 'A' + 1;
return (long) (value * Math.Pow(26, str.Length - 1) +
ToBase10(str.Substring(1, str.Length - 1)));
}