6
votes

Comment obtenir des caractères continus dans C #?

J'ai un xxx

Je dois remplir la liste myList avec n valeurs.

Si la valeur de n est 2, la liste myList contiendra xxx

si 10 puis xxx

si 30 puis xxx

si 1000 puis xxx

Je ne sais pas comment faire cela.

aidez-moi à bien faire cela en utilisant n'importe quelle méthode utilisant linq ou Lambda Expression


9 commentaires

Avez-vous besoin d'un CSV? Vous pouvez utiliser un StringBuilder et appendez n valeurs au lieu d'utiliser une liste . Ou voulez-vous convertir une liste existante de chaînes en CSV?


@Pavanred: Je ne pense pas que les CSV soient nécessaires ici - juste une liste de chaînes.


Stackoverflow.com/questions/314466/...


Pourquoi "AB" ... "AZ" et "ABC" ...? Quel est le problème avec "AA" et "AAA"?


@Pramodh: vous avez manqué "za" .. "zz" :)


@Pramodh: Jetez un coup d'œil à mon "Edit 2". J'ai trouvé une solution assez facile.


Dupe: Stackoverflow. com / questions / 297213 / ... Stackoverflow.com/questions/181596/... Stackoverflow.com/Questtions/2522720/... < / a> Stackoverflow.com/Questtions/837155/... etc.


@Ken: Ce ne sont pas 100% de duplicats. Ce n'est pas la même chose si vous tournez un numéro dans une chaîne ou si vous créez une séquence continue de chaînes. Si vous regardez ma réponse, cela ne dépend pas de la rotation des chiffres en chaînes.


Je pense que la réponse la plus élégante à ce type de question serait une sorte d'algorithme récursif


6 Réponses :


3
votes

Ceci est similaire à Cette question (mais pas assez pour marquer C'est en tant que duplicaté, et c'est un problème difficile à rechercher de toute façon).

Utilisez l'une des réponses IEnumerable (ou au moins, qui couvrent la plage dont vous avez besoin), Et puis si vous devez créer une liste avec un certain nombre d'éléments, utilisez simplement: xxx


6 commentaires

Ce n'est pas vraiment une réponse à la question imo.


C'est un problème facile à rechercher si vous reconnaissez que c'est ce que Excel fait - Essayez de rechercher "Excel colonne CHAR" ou similaire. :-)


@Stefan: De quelle manière est-ce pas une réponse à la question? Ajoutez une réponse de l'autre question, ajoutez la ligne supplémentaire et vous avez terminé. Qu'est-ce qui ne va pas avec ça, précisément?


@Jon: La question concerne la génération de chaînes d'une certaine manière. Vous répondez est davantage sur l'utilisation de la prise lorsque vous avez déjà résolu le problème.


Stefan: Je suis en désaccord. Si vous suivez le lien de Jon, vous verrez plusieurs réponses à la question de la manière de générer les chaînes d'une certaine manière. La seule partie manquante est le .take (). Tolist () que JON a ajouté ici.


@ Gabe / jon. Ok désolé, je n'ai pas lu les réponses sur la question liée auparavant. Les réponses sont vraiment très similaires.



3
votes

Ce code fonctionne bien, mais je ne sais pas si c'est "linq assez". XXX


7 commentaires

Il passe directement de "AZ" directement à "ABC" et de "ABZ" à "ABCD".


@Danny Chen: Maintenant, cela fonctionne, mais ce n'est pas très efficace ... cela crée un demi-million de cordes pour que ces milliers de ...


@Guffa: Je suis d'accord avec vous :( Ce problème est apporté par SelectMany , qui génère des caractères continus dans le lot. Mais je pense que si N n'est pas si grand, c'est une bonne idée parce que le code est une bonne idée parce que le code est plus lisible et facile à gérer.


@Guffa: J'ajoute un prenez méthode avant SelectMany , il est maintenant plus effacieux. Merci pour vos conseils.


@Danny Chen: Vous créez maintenant toujours une collection qui n'est jamais utilisée avant de quitter la boucle. Pourquoi ne pas commencer par générateur = nouvelle liste {""} et peupler premier générateur d'abord dans la boucle. :)


@Guffa: vous génie! Appuyez sur le clou sur la tête :) Mais si je commence par Générateur vide, comment puis-je générer la liste à addrange avec SelectMany ? Il semble que la logique de la première boucle soit différente avec les prochaines boucles.


@Danny Chen: "" + ch = ch, alors {""} .Celectmany (...) = validaux. :)



4
votes

J'ai fait Quelque chose de similaire dans SQL A En retour.

traduit en c # Il s'agit d'une fonction pour créer un code à partir d'un numéro: xxx

alors vous obtenez des numéros de 1 et plus et traduisez des codes : xxx

La limite de la fonction est actuellement "Zzzzzz" ou 321272406. (Après cela, vous obtenez une division à zéro.)

Notez que cette La fonction utilise toutes les combinaisons et renvoie "A" .. "Z", "AA" .. "ZZ", "AAA" ... "ZZZ" plutôt que de commencer à "AB" et "ABC". < / p>


0 commentaires

0
votes

@dannynychen c'est ça. Votre code avec un peu de modifications ..

char[] validChars = Enumerable.Range(0, 26).Select(i => (char)('A' + i)).ToArray();

int n = 30;
int pointer = 0;
int pointerSec = 0;
int Deg = 0;
string prefix = string.Empty;
string prefixMore = string.Empty;
List<string> result = new List<string>();

while (n > 0)
{
    result.AddRange(validChars.Skip(pointer).Select(ch => prefix + ch).Take(n));
    if (pointer == 26)
    { 
        pointer = -1;
        Deg += 1;
        prefixMore = "" + validChars[pointerSec];
        pointerSec++;
        n++;
    }
    else
    {
        if (Deg == 0)
        {
            prefix = "" + validChars[pointer];
        }
        else
        {
            prefix = prefixMore + validChars[pointer];
        }
    }
    n--;
    pointer++;
}


1 commentaires

@Pramodh ... Est-ce ce que tu veux ..!



1
votes

Essayez le ci-dessous .. J'utilise Croix Join Join et A Union pour construire la source, puis filtrer l'enregistrement en utilisant la méthode prise XXX

J'espère que cela vous donnera une idée d'utiliser une combinaison de la méthode LINQ, Lambda et Extension.


0 commentaires

6
votes

EDIT 2 STRUT>:

C'est probablement le moyen le plus simple de la mettre en œuvre fort>. Je l'ai testé, ça marche bien. Vous pouvez générer un nombre infini de chaînes. P>

public void IEnumerale<string> GenerateStrings()
{
  int index = 0;
  // generate "infinit" number of values ...
  while (true)
  {
     // ignoring index == int.MaxValue
     yield return GetString(index++);
  }
}

List<string> strings = GenerateStrings().Take(1000).ToList();


1 commentaires

Nice approche, bien que int i suffixecounter = 0; ne compile pas, et que vous n'utilisez pas i ni suffixeCounter .