7
votes

en C #, comment puis-je construire une matrice d'A à ZZ qui est similaire à la manière dont Excel ordonne des colonnes

Je cherche le code qui peut générer un tableau où le premier élément est A , puis B , puis c . . .efter z Il irait alors à AA , puis AB ALL AC . . . tout le chemin jusqu'à zz .

Quelle est la meilleure façon de le faire en C #?


0 commentaires

10 Réponses :


0
votes

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. :)


0 commentaires

1
votes

Vous pouvez générer des chiffres à l'aide de énumérable.range et de les jeter à char pour générer A-Z. La prochaine étape consiste à les combiner.


0 commentaires

29
votes

L'une des voies est la suivante:

foreach (var s in generate().Take(200)) Console.WriteLine(s);


5 commentaires

C'est si simple et élégant c'est effrayant :)


Je retournerais nouvelle chaîne (nouveau [] {c, d}) 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 n'est pas le même que A . 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.)



1
votes

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


0 commentaires

1
votes
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() )
      )
   )
);

2 commentaires

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.



1
votes
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);
    }
}

0 commentaires

1
votes

Voici un moyen. :) xxx


0 commentaires

6
votes

Une excellente réponse de VLAD.

Voici une autre variation de celle-ci: xxx

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: xxx


1 commentaires

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 ""; .



0
votes

Vous pouvez aussi essayer ceci. A à zz xxx


0 commentaires

0
votes

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)));
}


0 commentaires