J'ai une sortie Powershell à reformater, car le formatage se perd dans mon StandardOutput.ReadToEnd ().
Il y a plusieurs espaces à supprimer dans une ligne et je veux que la sortie formatée soit lisible. La sortie actuelle dans mon messageBox ressemble à
string first = ""; string last = ""; int idx = line.LastIndexOf(" "); if (idx != -1) { first = line.Substring(0, idx).Replace(" ","").PadRight(10, '~'); last = line.Substring(idx + 1); } MessageBox.Show(first + last);
Ce que je veux c'est
Microsoft.MicrosoftJigsaw All Microsoft.MicrosoftMahjong All
Qu'est-ce que je fais mal?
Ma connaissance C # est toujours au niveau de base uniquement
J'ai trouvé cette question ici, mais peut-être que je ne comprends pas correctement la réponse. La solution ne fonctionne pas pour moi.
Remplir une chaîne à l'aide de la méthode PadRight
Ceci est mon code actuel:
Microsoft.MicrosoftJigsaw All Microsoft.MicrosoftMahjong All
3 Réponses :
Le PadRight(10
ne suffit pas, c'est la taille de la chaîne complète.
J'irais probablement pour quelque chose comme:
Microsoft.MicrosoftJigsaw All Microsoft.MicrosoftMahjong All
Montrera:
string[] lines = new[] { "Microsoft.MicrosoftJigsaw All", "Microsoft.MicrosoftMahjong All" }; // iterate all (example) lines foreach (var line in lines) { // split the string on spaces and remove empty ones // (so multiple spaces are ignored) // ofcourse, you must check if the splitted array has atleast 2 elements. string[] splitted = line.Split(new Char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); // reformat the string, with padding the first string to a total of 40 chars. var formatted = splitted[0].PadRight(40, ' ') + splitted[1]; // write to anything as output. Trace.WriteLine(formatted); }
Vous devez donc déterminer la longueur maximale de la première chaîne.
Merci pour votre code, mais j'obtiens une erreur de conversion ici. CS1503 C # Argument 2: impossible de convertir de en chaîne 'char' [] splitted = line.Split ('', StringSplitOptions.RemoveEmptyEntries);
Vous le testez probablement sur du violon?
@ J.vanLangen, String.Split()
accepte un tableau de caractères ou de chaînes comme premier paramètre avec StringSplitOptions
Mon mauvais, j'ai utilisé ma propre méthode d'extension ... Je l'ai changé.
String.PadLeft()
premier paramètre String.PadLeft()
définit la longueur de la chaîne String.PadLeft()
, pas le nombre de symboles de remplissage.
Tout d'abord, vous pouvez parcourir toutes vos chaînes, diviser et enregistrer.
Deuxièmement, vous devriez obtenir la longueur de chaîne la plus longue.
Enfin, vous pouvez formater les chaînes au format requis.
Microsoft.MicrosoftJigsaw All Microsoft.MicrosoftMahjong All
Résultat:
var strings = new [] { "Microsoft.MicrosoftJigsaw All", "Microsoft.MicrosoftMahjong All" }; var keyValuePairs = new List<KeyValuePair<string, string>>(); foreach(var item in strings) { var parts = item.Split(new [] {" "}, StringSplitOptions.RemoveEmptyEntries); keyValuePairs.Add(new KeyValuePair<string, string>(parts[0], parts[1])); } var longestStringCharCount = keyValuePairs.Select(kv => kv.Key).Max(k => k.Length); var minSpaceCount = 5; // min space count between parts of the string var formattedStrings = keyValuePairs.Select(kv => string.Concat(kv.Key.PadRight(longestStringCharCount + minSpaceCount, ' '), kv.Value)); foreach(var item in formattedStrings) { Console.WriteLine(item); }
J'ai testé cette solution et elle fonctionne très bien telle quelle. MAIS ... je cherchais du mauvais côté. Le problème est que j'essaye de sortir le texte dans une MessageBox (je l'ai dit dans ma question). Tout le problème vient d'une police non monospace. J'utilise maintenant un nouveau formulaire avec une zone de texte comme boîte de message alternative. La police est définie sur Arial Monospaced et tout a l'air bien comme il se doit. Merci à tous pour votre soutien! Je ne sais pas si je dois marquer cette réponse comme une solution ou répondre à ma propre question avec ce que j'ai découvert sur le monospace
En supposant que la longueur de la deuxième partie de votre chaîne est de 10, mais vous pouvez la modifier. Essayez le morceau de code ci-dessous:
Fonction:
Microsoft.MicrosoftJigsaw All Microsoft.MicrosoftMahjong All
Appel:
string line1String = PrepareStringAfterPadding("Microsoft.MicrosoftJigsaw All", 40); string line2String = PrepareStringAfterPadding("Microsoft.MicrosoftMahjong All", 40);
Résultat:
private string PrepareStringAfterPadding(string line, int totalLength) { int secondPartLength = 10; int lastIndexOfSpace = line.LastIndexOf(" "); string firstPart = line.Substring(0, lastIndexOfSpace + 1).Trim().PadRight(totalLength - secondPartLength); string secondPart = line.Substring(lastIndexOfSpace + 1).Trim().PadLeft(secondPartLength); return firstPart + secondPart; }
Remarque:
Le code est donné à des fins de démonstration, veuillez personnaliser le totalLength et secondPartLength et l'appel de la fonction selon vos besoins.
L'argument de PadRight (10) est la taille de la ligne complète. La longueur de
Microsoft.MicrosoftJigsaw
est bien plus longue.Essayez d'utiliser 29/30 au lieu de 10 pour le padright.
Pouvez-vous expliquer pourquoi vous pensez que votre programme devrait fonctionner et ce que vous pensez qu'il devrait faire? En comprenant en quoi vos croyances sont fausses, nous pouvons mieux vous désabuser des fausses croyances.
vous pouvez essayer d'insérer une tabulation dans la chaîne à la place, ce serait en quelque sorte aligner les différents mots aux mêmes emplacements de tabulation.
"\t"
est ce que vous devez utiliser dans la chaîne, donc le vôtre ressemblerait à"Microsoft.MicrosoftJigsaw\tAll"
et"Microsoft.MicrosoftMahjong\tAll"
, parfois il est nécessaire de deux onglets qui seraient simplement"\t\t"
J'ai essayé 50 au lieu de 10 maintenant, mais en conséquence, le '~' est placé juste sous la chaîne 'last', bien qu'il doive être placé juste sous la chaîne 'first' de mon attente. J'utilise le '~' pour le débogage uniquement. Il devrait y avoir un espace plus tard. «~» est bien mieux à voir.
first = line.Substring (0, lastIndexOfSpace + 1) .Trim (). PadRight (totalLength - secondPartLength); last = line.Substring (lastIndexOfSpace + 1) .Trim (). PadLeft (secondPartLength);