1
votes

string.PadRight () ne semble pas fonctionner dans mon code

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

c#

6 commentaires

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


3 Réponses :


1
votes

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.


4 commentaires

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é.



1
votes

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


1 commentaires

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



0
votes

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.


0 commentaires