У меня есть рабочее решение прямо сейчас, но оно кажется действительно уродливым для чего-то настолько (казалось бы) простого.
Я пытался просто разбить его, когда добавление слова идет над полпути, и разделяется до и после добавления слова, но в зависимости от длины слов оно либо не сбалансировано по отношению к первой или второй строке.
Примеры входных данных, с которыми у меня изначально были проблемы перед запутанным исправлением:
Входные данные "Macaroni Cheese"
и "Cheese Macaroni"
Должны выводить "Macaroni<br/> Cheese"
и "Cheese<br/> Macaroni"
соответственно.
Но более простые решения работали либо с первым, но не со вторым, или наоборот.
Итак, вот что у меня работает, но мне интересно, есть ли более элегантныйспособ сделать это.
public string Get2LineDisplayText(string original)
{
string[] words = original.Split(new[] {' ', '\r', '\n'}, StringSplitOptions.RemoveEmptyEntries);
//Degenerate case with only 1 word
if (words.Length <= 1)
{
return original;
}
StringBuilder builder = new StringBuilder();
builder.Append(words[0]); //Add first word without prepending space
bool addedBr = false;
foreach (string word in words.Skip(1))
{
if (builder.Length + word.Length < original.Length / 2) //Word fits on the first line without passing halfway mark
{
builder.Append(' ' + word);
}
else if (!addedBr) //Adding word goes over half, need to see if it's more balanced on the 1st or 2nd line
{
int diffOnLine1 = Math.Abs((builder.Length + word.Length) - (original.Length - builder.Length - word.Length));
int diffOnLine2 = Math.Abs((builder.Length) - (original.Length - builder.Length));
if (diffOnLine1 < diffOnLine2)
{
builder.Append(' ' + word);
builder.Append("<br/>");
}
else
{
builder.Append("<br/>");
builder.Append(' ' + word);
}
addedBr = true;
}
else //Past halfway and already added linebreak, just append
{
builder.Append(' ' + word);
}
}
return builder.ToString();
}
Пример ввода / вывода: