Есть строка, необходимо разбить её на подстроки по 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));
}
Если я правильно вас понял, то можно сперва разбить строку на куски по \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);
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Как подключить ссылку к создаваемому приложению? К примеру SystemManagement
Сегодня начались проблемы с авторизацией, ранее всё работало, в чём причина ?