-1
votes

Formater une chaîne comme indiqué ci-dessous

J'ai une liste de livres et des dates publiées que je devrais formater comme indiqué ci-dessous xxx

j'ai essayé stringbuilder xxx

Mais montrant les données côte à côte, c'est où je suis bloqué, toute aide sera appréciée.


8 commentaires

Vous devez prendre 2 à la fois, car il y a 2 livres sur chaque ligne


Juste une note: stringbililater a une méthode appendline afin de ne pas avoir besoin de concaténer le nouvelle ligne sur là ...


Donc, vous ne triez pas les éléments de rien, vous voulez simplement le formater en deux colonnes?


S'il vous plaît être explicite sur ce que vous essayez d'accomplir. C'est-à-dire que je pense que vous essayez d'obtenir deux enregistrements à la fois. Est-ce exact? Si oui, mettez à jour votre question indiquant que


Vous devez envisager d'utiliser une boucle et des index ou potentiellement une opération de fermeture à glissière. Dans un moyen créatif


Vous souciez-vous de la commande?


non je ne me soucie pas de l'ordre dans lequel ils se présentent


oui je ne trie pas par rien


5 Réponses :


4
votes
  • Affichage des données dans des colonnes de taille uniforme nécessite deux boucles via les données, la première boucle est d'obtenir la longueur maximale du texte à afficher, puis la deuxième boucle utilise ensuite Padright pour ajouter suffisamment '< code>. '"caractères" à gauche aligner le texte comme vous avez dans votre exemple.
  • Utilisez PADRIGHT sur le texte de gauche-alignement, et padleft sur le texte d'aligner à droite.
  • padleft et PADRIGHT S ARGUME est la longueur de la chaîne maximum et n'est pas le nombre de caractères de rembourrage à ajouter.
  • Utilisez un format de date explicite mm-yy Pour vous assurer que toutes les sorties sont de 5 caractères (et pour éviter toute ambiguïté, vous devez utiliser des formats ISO 8601 et éviter toujours des années à 2 chiffres).
  • Affichage de plusieurs colonnes sur la même ligne nécessite un compteur distinct pour compter le nombre d'éléments écrites à la ligne actuelle jusqu'à présent et n'ajoute qu'une pause de ligne après avoir écrit 2 éléments à une ligne. xxx

4 commentaires

Oui.


De plus, vous voudrez peut-être ajouter 1 à ce longestName, sinon le nom le plus long ne sera pas séparateur à la date.


@Brettcaswell je l'ai couru à Linqpad et j'ai eu des résultats attendus. Vous n'avez pas besoin de soustraire une longueur car PADRIGHT Est-ce que pour vous.


Ah .. tu as raison .. j'étais présomptueux .. désolé. Je devrais avoir un double vérifié avant d'avoir posté le commentaire - je ne suis pas sûr de ce que "non aligné" suggère ici alors ..



3
votes

Je vais donc vous donner une option que vous devrez développer pour travailler pour tous les scénarios , mais cela devrait vous faire aller si vous l'aimez. J'utilise également une liste de chaînes comme un exemple simple; Vous ne devriez avoir aucun problème à l'appliquer à book s.

Vous avez une seule liste d'éléments à afficher dans deux colonnes, donc ce que vous pouvez faire est diviser l'original en deux et zip sauvegarder; Comme: xxx

sortie:

Premier: troisième
Deuxièmement: quatrième

Suivi: Que se passe-t-il quand il y a un nombre impair d'éléments?


1 commentaires

En ce qui concerne votre suivi .. Le zip suit la même considération que l'approche de boucle que j'ai fournie .. Vous devrez déterminer et gérer de manière conditionnelle le dernier enregistrement ..



1
votes

Effectuez ce qui suit: xxx

sortie: xxx


0 commentaires

0
votes

En considération des autres réponses - je fournirai la boucle à l'aide de l'approche d'index.


Définissez vos types avec des données simulées xxx

< em> code d'exemple xxx

Ceci émettra la suivante xxx

La boucle définie i comme itérateur sur l'index;

  • Cette valeur initiale sera 1 et nous ajouterons 2 pour chaque itération de la LOPP jusqu'à ce que i est plus grand puis max ou plutôt - la longueur de la liste. ( I - 1 représentera ensuite l'enregistrement précédent, i sera plus tard (ou même enregistrera, mais dans un ensemble de tableau de 0-index)

    En raison de cette approche, nous avons un scénario où le dernier enregistrement peut ne pas être représenté dans la boucle - ce qui est bien puisque le corps de cette boucle est conçu pour toujours gérer 2 enregistrements à la fois, et nous "

    EDIT 1:

    y compris la logique de remplissage (bien que le désir de cette réponse soit de présenter l'approche d'index de la boucle, non fournir nécessairement un échantillon de travail terminé)


0 commentaires

2
votes

Un moyen de produire une liste d'éléments du format de colonne consiste à déterminer le nombre de lignes (en divisant le nombre d'éléments à compter du nombre de colonnes et en ajoutant 1 si le nombre n'est pas uniformément divisible par le nombre de colonnes), et Ensuite, la sortie de "Colonne Nombre" Nombre d'éléments formatés sur la largeur de la colonne.

Nous pouvons écrire une méthode qui prend dans une liste des chaînes, puis émet les chaînes en colonnes d'une largeur spécifique: p>

// Note we can make our columns smaller and add more of them
columnWidth = 16;
columnCount = 4;
header = "Book".PadRight(columnWidth - 5) + "Date";
OutputInColumns(books.Select(b => AsColumnString(b, columnWidth)).ToList(), columnCount, 
    columnWidth, header);


2 commentaires

Après avoir exécuté votre solution, je reçois une exception d'exception {"L'index et la longueur doivent se référer à un emplacement de la chaîne. \ R \ nparamètre Nom: longueur"} system.argumentoutofrangeException à var nom = livre.substring (0, Wridth - 8) .padright (Columinawidth - 5, '.');


Oh, bonne prise! J'ai eu mis à jour le code sur ma machine mais j'ai oublié de le publier ici. J'ai mis à jour l'échantillon maintenant. Merci.