Лучший способ для записи строки тесак


Вот некоторый код, чтобы вставить новую строку escape-последовательности через определенное количество символов (для фиксированной ширины дисплея)

    private string spliceNoteText(string text)
    {
        StringBuilder sb = new StringBuilder();

        int maxWidth = 70;
        int blockOfText;

        for (int i = 0; i <= text.Length; i += maxWidth)
        {
            if (i >= text.Length)
                continue;

            int charsRemaining = text.Length - i;

            if (charsRemaining <= maxWidth)
                blockOfText = charsRemaining;
            else
                blockOfText = maxWidth;

            sb.Append(text.Substring(i, blockOfText));
            sb.Append("\n");

        }
        return sb.ToString();
    }

Это некрасиво и скучно, это может быть сделано красивее и более элегантным?



3050
6
задан 10 октября 2011 в 02:10 Источник Поделиться
Комментарии
5 ответов

Вы уже смогли создать то StringBuilder с текстом вы хотите, чтобы 'соединить', а не вновь построить его. Затем вы можете просто определить, сколько символов новой строки, который вы хотите добавить (и вы должны использовать окружающую среду.Строки вместо того, чтобы указывать это явным образом), и вставить их в нужное место.

    private string SpliceNoteText(string text, int maxWidth)
{
StringBuilder sb = new StringBuilder(text);

for (int i = 0; i < (sb.Length / maxWidth); i++)
{
int insertPosition = i * maxWidth;
sb.Insert(insertPosition, Environment.NewLine);
}

return sb.ToString();
}

3
ответ дан 10 октября 2011 в 04:10 Источник Поделиться

Вы можете сделать его многоразовым, принимая параметр длины линии, и вы можете использовать регулярное выражение, чтобы немного сократить код:

public static string SpliceNoteText(string text, int lineLength) {
return Regex.Replace(text, "(.{" + lineLength + "})", "$1" + Environment.NewLine);
}

Обратите внимание, что я использовал среду.Символ новой строки , который дает символ новой строки сочетание для нынешней системы, а не символ новой строки escape-последовательность. Вот что вы обычно делаете, но оно может не применяться в вашем конкретном случае, в зависимости от того, как вы собираетесь использовать строку.

Редактировать:

Регулярное выражение-это, конечно, не так быстро, как и оригинальный код. Простой тест производительности для соединять 100000 строку символов дает:

Original  0,23 ms.
Regexp 1,31 ms.
Insert 15,06 ms.

3
ответ дан 11 октября 2011 в 08:10 Источник Поделиться

Также могли бы использовать LINQ

public static string SpliceNoteText(string text, int lineLength) 
{
var segments = (int)Math.Ceiling( (double)text.Length / (double)lineLength);
return string.Join(Environment.NewLine,
Enumerable.Range(0,segments
).Select(i => x.Substring(i * maxLength, Math.Min( lineLength, text.Length - i * lineLength ))));
}

Обновлено

Быстрее с поиском

public static string SpliceNoteText(string text, int lineLength) 
{
int k = 0;
return string.Join(Environment.NewLine, text.ToLookup(c => k++ / lineLength)
.Select(e => new String(e.ToArray())));
}

0
ответ дан 13 октября 2011 в 01:10 Источник Поделиться

Вы можете не создавать кучу временных строк (копирование всех данных персонажа дважды) с помощью StringBuilder, чтобы что-то ближе свой потенциал.

private static string SpliceNoteText(string text, int maxWidth)
{
if (string.IsNullOrEmpty(text)) return text;

int numWraps = (text.Length - 1) / maxWidth;
StringBuilder sb = new StringBuilder(text.Length + numWraps * Environment.NewLine.Length);

for (int i = 0, off = 0; i < numWraps; i++, off += maxWidth) {
sb.Append(text, off, maxWidth).Append(Environment.NewLine);
}
sb.Append(text, off, text.Length - off);

return sb.ToString();
}

0
ответ дан 14 октября 2011 в 07:10 Источник Поделиться

Для того чтобы соединить строки в целом, это будет быстрее и эффективнее, используя LINQ или другими методами.

public static IEnumerable<string> Splice(this string s, int spliceLength)
{
if (s == null)
throw new ArgumentNullException("s");
if (spliceLength < 1)
throw new ArgumentOutOfRangeException("spliceLength");

if (s.Length == 0)
yield break;
var start = 0;
for (var end = spliceLength; end < s.Length; end += spliceLength)
{
yield return s.Substring(start, spliceLength);
start = end;
}
yield return s.Substring(start);
}

Затем, чтобы использовать с вашей функции:

static string SpliceNoteText(string text)
{
return String.Join(Environment.NewLine, text.Splice(70));
}

Если вы не хотите использовать отдельный (внутренний) метод или использовать строку.Присоединиться(), он должен быть легким, чтобы объединить их.

static string SpliceNoteText(string text)
{
if (text == null)
throw new ArgumentNullException("text");

if (text.Length == 0)
return String.Empty;
const int spliceLength = 70;
var sb = new StringBuilder();
var start = 0;
for (var end = spliceLength; end < s.Length; end += spliceLength)
{
sb.Append(text, start, spliceLength).AppendLine();
start = end;
}
sb.Append(text, start, text.Length - start);
return sb.ToString();
}

0
ответ дан 17 октября 2011 в 08:10 Источник Поделиться