Je voudrais modifier une chaîne source qui ressemble à
var folder = "one.two.three";
var folderParts = folder.Split('.');
var newFolder = new StringBuilder();
for (int i = 0; i < folderParts.Length; i++)
{
for (int j = 0; j < i; j++)
{
if (j == 0)
{
newFolder.Append("\\");
}
newFolder.Append($"{folderParts[j]}.");
}
newFolder.Append(folderParts[i]);
}
et la transférer dans une chaîne avec des barres obliques pour l'utiliser comme une chaîne de dossier qui a la structure suivante: p>
"one\one.two\one.two.three"
Connaissez-vous des façons plus élégantes de réaliser cela que ma solution ci-dessous? Je ne suis pas très satisfait de mes boucles for.
"one.two.three"
4 Réponses :
Vous pouvez essayer Linq:
one\one.two\one.two.three
string folder = "one.two.three";
string[] parts = folder.Split('.');
string result = Path.Combine(Enumerable
.Range(1, parts.Length)
.Select(i => string.Join(".", parts.Take(i)))
.ToArray());
Console.Write(newFolder);
p >
Peut-être utiliser Path.Combine sur cette première string.Join , pour multiplateforme?
@ canton7: Merci! Path.Combine est bien meilleur dans le contexte
Vous pouvez le faire de manière assez laconique avec Regex
var a = "";
var newFolder = Path.Combine(folder.Split('.')
.Select(x => a += (a == "" ? "" : ".") + x).ToArray());
Cela correspond à chaque période. Chaque fois qu'il trouve un point, il insère une barre oblique inverse puis la chaîne d'entrée entière avant la correspondance ( $ `). Nous devons ajouter le point à nouveau à la fin.
Donc, les étapes sont (
un.two.trois one\one.two.three one\one.two\one.two.three Pour les points bonus, utilisez Path.DirectorySeparatorChar pour l'exactitude multiplateforme.
var newFolder = Regex.Replace(folder, @"\.", $"{Path.DirectorySeparatorChar}$`.")
Voici une autre méthode linqy: p>
var newFolder = Regex.Replace(folder, @"\.", @"\$`.");
Agréable! Juste sur Remplacer pour obtenir le résultat
C'est, bien sûr, la solution la plus courte mais assez difficile à lire si vous n'êtes pas un geek de regex. Merci pour l'explication détaillée! :)
Merci également pour l'indication concernant la compatibilité multiplateforme.
@Christoph d'accord. J'ai dit que c'était laconique, non pas que c'était nécessairement lisible! Pour être honnête, j'écrirais un commentaire contre l'une de ces solutions en disant ce qu'elle a fait. Vous pouvez ajouter quelques lignes supplémentaires de commentaires à celui-ci expliquant comment cela fonctionne avant qu'il ne soit aussi long que la prochaine réponse test.
Vous pouvez avancer dans une seule boucle comme ceci:
var folder = "one.two.three";
var newFolder = new StringBuilder();
int index = -1;
while (index + 1 < folder.Length) {
index = folder.IndexOf('.', index + 1);
if (index < 0) {
newFolder.Append(folder);
break;
}
else {
newFolder.Append(folder, 0, index);
newFolder.Append(Path.DirectorySeparatorChar);
}
}
Vous pouvez essayez-le ici .
Au lieu de diviser la chaîne en premier, je trouve plus élégant de commencer par ce que vous avez et de le réduire:
one\one.two\one.two.three
Sortie:
XXX
Il y a doit être un moyen de faire cela avec Aggregate, mais je ne peux pas vraiment mettre le doigt dessus.