Я проверял ответы Джона и Лессана, но они не работают должным образом, если ваша максимальная длина должна быть абсолютной, а не приблизительной. Поскольку их счетчик увеличивается, он не считает пустое пространство, оставшееся в конце строки.
Запустив их код на примере OP, вы получите:
1 part: "Silver badges are awarded for " - 29 Characters
2 part: "longer term goals. Silver badges are" - 36 Characters
3 part: "uncommon. " - 13 Characters
«Есть» в строке два, должно быть в строке три. Это происходит потому, что счетчик не содержит 6 символов в конце первой строки.
Я предложил следующую модификацию ответа Лессана, чтобы объяснить это:
public static class ExtensionMethods
{
public static string[] Wrap(this string text, int max)
{
var charCount = 0;
var lines = text.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
return lines.GroupBy(w => (charCount += (((charCount % max) + w.Length + 1 >= max)
? max - (charCount % max) : 0) + w.Length + 1) / max)
.Select(g => string.Join(" ", g.ToArray()))
.ToArray();
}
}