Разбейте строку на отдельные строки: вскрытие - PullRequest
0 голосов
/ 13 октября 2009

Размещение устаревших таблиц базы данных, разработанных специально для экранов мэйнфреймов IBM, которые они представляют, вызвало у меня сильное раздражение. Часто я нахожу необходимость разбить строку на несколько строк, чтобы соответствовать ширине столбца таблицы, а также пользователям, которые все еще просматривают данные с помощью эмуляторов терминала. Вот две функции, которые я написал для выполнения этой задачи, принимая строку и ширину линии в качестве параметров и возвращая перечисляемую строку. Как вы думаете, какая функция лучше и почему? И во что бы то ни стало поделитесь супер-легким-быстрым эффективным способом, который я полностью упустил из виду.

  public string[] BreakStringIntoArray(string s, int lineWidth)
  {
   int lineCount = ((s.Length + lineWidth) - 1) / lineWidth;
   string[] strArray = new string[lineCount];
   for (int i = 0; i <= lineCount - 1; i++)
   {
    if (((i * lineWidth) + lineWidth) >= s.Length)
     strArray[i] = s.Substring(i * lineWidth);
    else
     strArray[i] = s.Substring(i * lineWidth, lineWidth);
   }
   return strArray;
  }

против

  public List<string> BreakStringIntoList(string s, int lineWidth)
  {
   List<string> lines = new List<string>();
   if (s.Length > lineWidth)
   {
    lines.Add(s.Substring(0, lineWidth));
    lines.AddRange(this.BreakStringIntoList(s.Substring(lineWidth), lineWidth));
   }
   else
   {
    lines.Add(s);
   }
   return lines;
  }

Например, передача ("Hello world", 5) вернет 3 строки:

"Hello"
" worl"
"d"

Ответы [ 5 ]

0 голосов
/ 14 октября 2009

Мне нравится решение от Itay, но оно не дает правильного вывода, так что вот моя отредактированная версия.

protected void Page_Load(object sender, EventArgs e)
{
    string a = "12345678901234567890123456789012345";
    TextBox1.Text = a;
    TextBox2.Text = BreakStringIntoLinesVer2(a, 10);

}

string BreakStringIntoLinesVer2(string s, int lineWidth)
{
    StringBuilder sb = new StringBuilder(s);
    int last = (sb.Length % lineWidth == 0) ? sb.Length - lineWidth : sb.Length - (sb.Length % lineWidth);

    for (int i = last; i > 0; i -= lineWidth)
    {
        sb.Insert(i, Environment.NewLine);
    }
    return sb.ToString();
}
0 голосов
/ 13 октября 2009

РЕДАКТИРОВАТЬ: извините, я думал, вы хотите, чтобы одна строка была разделена на строки ^ __ ^ "

зависит от длины строки .. но для длинных:

    string BreakStringIntoLines(string s, int lineWidth)
    {
        StringBuilder sb = new StringBuilder(s);
        for (int i = lineWidth; i < sb.Length; i += lineWidth)
        {
            sb.Insert(i, Environment.NewLine);
        }
        return sb.ToString();
    }
0 голосов
/ 13 октября 2009
public List<string> BreakStringIntoLines(string s, int lineWidth)
{
     string working = s;
     List<string> result = new List<string>(Math.Ceil((double)s.Length / lineWidth));
     while (working.Length > lineWidth)
     {
          result.add(working.Substring(0, lineWidth);
          working = working.Substring(5);
     }

     result.Add(working);

     return result;
}

Наверное, я бы так и сделал. Список более гибок, чем строковый массив IMHO.

Кроме того, я бы избежал рекурсии, как чума. Гораздо проще создать и отладить то, что использует простой цикл.

0 голосов
/ 13 октября 2009
Regex.Replace(input, ".{5}", x => x.Value + "\n").Split(new char [] {'\n'})
0 голосов
/ 13 октября 2009

Первый способ намного лучше.

Второй будет производить тонны временных объектов, которые совершенно не нужны, если вы можете заранее определить количество целевых линий.

И за то, что вы что-то упустили: в зависимости от требований к скорости вы, вероятно, могли бы использовать указатели для значительного ускорения (зависит от того, что вы на самом деле хотите сделать с результатом). Но это будет намного сложнее, чем сейчас.

Просто для количественной оценки «тонн временных объектов». Если у вас есть строка размером 1 МБ (а длина строки в худшем случае равна 1), первый подход требует 1 МБ выделения памяти для содержимого строки. Второму потребуется 500 ГБ памяти для хранения строкового содержимого.

...