Разбивка строки на подстроки по двум условиям

195
19 марта 2018, 22:53

Есть строка, необходимо разбить её на подстроки по 2 условиям:

  • По длине подстроки (она не должна превышать размера chunk)
  • По вхождению управляющего символа новой строки \n

То есть, нужно разбить строку на блоки, но при этом не как попало, а так, чтобы блоки начинались и оканчивались новыми строками, без разрывов.

Написал вот такой алгоритм, но как-то чересчур громоздко получилось. Вожусь уже довольно долго, поэтому вдохновение иссякло и глаз уже замылился. Прошу помочь.

var chunk = 10;
var s = "long-long\n string\n with some\n chars";
var messages = new List<string>();
for (var i = chunk;; i += chunk)
{
    if (i >= s.Length)
    {
        messages.Add(s.Substring(i + 1 - chunk));
        break;
    }
    i = s.LastIndexOf('\n', i >= s.Length ? s.Length - 1 : i, 200);
    if (i <= chunk)
    {
        messages.Add(s.Substring(0, i));
        continue;
    }
    var len = messages.Last().Length;
    messages.Add(s.Substring(len, i - len)); 
}
Answer 1

Если я правильно вас понял, то можно сперва разбить строку на куски по \n, а потом укрупнить их до требуемой длины:

var chunk = 10;
var s = "long-long\n string\n XX\nwith some\n chars";
// Разбиваем на куски по разделителю
string[] parts = s.Split('\n');
// Список с готовыми сообщениями, собранными из кусков
var messages = new List<string>();
// Текущее сообщение, которое собираем из кусков
string message = string.Empty;
foreach (string part in parts)
{
    if (message.Length + part.Length + 1 > chunk)
    {
        // Если текущий кусок не помещается в message по ограничению длины
        messages.Add(message);
        message = part + "\n";
    }
    else
        message += part + "\n";
}
// Если в message что-то осталось
messages.Add(message);

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

foreach (string part in parts)
{
    string message = part + "\n";
    while (message.Length > chunk)
    {
        messages.Add(message.Substring(0, chunk));
        message = message.Substring(chunk);
    }
    if (message.Length != 0)
        messages.Add(message);
}
READ ALSO
c# добавление кнопок в форму

c# добавление кнопок в форму

Есть форма она разделена на 2 частиВ левой создана кнопка

312
CodeDom Compiler подключение ссылки

CodeDom Compiler подключение ссылки

Как подключить ссылку к создаваемому приложению? К примеру SystemManagement

185
Проблемы с авторизацией VkNet

Проблемы с авторизацией VkNet

Сегодня начались проблемы с авторизацией, ранее всё работало, в чём причина ?

176