Ceci évite une boucle qui ajoute de façon répétée la chaîne. Au lieu de cela, je "double" la corde jusqu'à ce qu'elle se rapproche de la bonne longueur et ensuite je mets les morceaux "doublés" ensemble de manière appropriée.
static string Repeat(string s, int length) {
if (length < s.Length) {
return s.Substring(0, length);
}
var list = new List<string>();
StringBuilder t = new StringBuilder(s);
do {
string temp = t.ToString();
list.Add(temp);
t.Append(temp);
} while(t.Length < length);
int index = list.Count - 1;
StringBuilder sb = new StringBuilder(length);
while (sb.Length < length) {
while (list[index].Length > length) {
index--;
}
if (list[index].Length <= length - sb.Length) {
sb.Append(list[index]);
}
else {
sb.Append(list[index].Substring(0, length - sb.Length));
}
}
return sb.ToString();
}
Ainsi, par exemple, sur l'entrée (« Bonjour, monde! », 64), nous construisons les chaînes
13: Hello, World!
26: Hello, World!Hello, World!
52: Hello, World!Hello, World!Hello, World!Hello, World!
Ensuite, nous construirions le résultat par concaténer la chaîne de longueur 52 à la Je sous -signe la longueur 12 de la chaîne de longueur 13.
Je suppose, bien sûr, que par octets, vous vouliez dire longueur. Sinon, vous pouvez facilement modifier les encodages ci-dessus en utilisant ce que vous voulez en termes d'octets.
Considérez-vous 1 caractère == 1 octet? Parce que pour le codage ASCII pur est correct, mais pour d'autres codages, il pourrait être faux ... – digEmAll