У меня есть строка, как на следующем рисунке:
Я использую API, который принимает эту большую строку в json, например, {"data" : "the large string which in the picture"}
Поэтому я хотел разработать его и отправить строку в двух запросах, но когда я пытался использовать Length / 2
, я получил половину этой большой строки, но не завершенную строку, как на следующем рисунке:
Я хочу получить половину этой строки с завершенной строкой, чтобы избежать тайм-аута в запросах
код, который дал мне этот результат:
DataPart1.data = Encoding.ASCII.GetString(dataByte.Take(dataByte.Length / 2).ToArray());
DataPart2.data = Encoding.ASCII.GetString(dataByte.Skip(DataPart1.data.Count()).ToArray()).ToString();
Какая длина строки?
@DmitryBychenko огромный и непостоянный
вы можете посчитать строки, а затем разделить их на 2, чтобы получить половину вашей длинной строки
@ er-shoaib в строке нет строк
Самый простой способ - разделить строку разделителем новой строки, а затем присоединить к ней половину массива и отправить ее, но это будет очень-очень медленно. Как насчет того, чтобы найти половину строки, а затем найти следующий символ новой строки в цикле?
@PrashantPimpale я разместил код, который я пробовал
Я видел на вашем втором снимке экрана, что в вашем тексте есть строки, поэтому я предлагаю вам строки
@ er-shoaib на моем изображении просто строка из компилятора, если бы мне нужно было oooooooooooo, большой экран был бы показан как одна строка
@Mailosz: Тоже моя первая идея, но есть более быстрый способ. Разрежьте нить на 2 половины. Искать последний перенос строки в первой строке. Обрежьте его там и положите оставшуюся перед второй ниткой.
@ H.G.Sandhagen Верно, это было бы быстрее, а в некоторых случаях проще реализовать.
Чтобы найти точный индекс, по которому вы хотите разделить строку, вы можете попробовать найти ближайший \r\n
рядом с серединой строки, используя метод String.IndexOf(string value, int startIndex)
.
Код будет выглядеть примерно так
var str = "1,2,3,4\r\n5,6,7,8\r\n9,10,11,12";
var half = str.Substring(0, str.IndexOf("\r\n", str.Length / 2));
Что приводит к "1,2,3,4\r\n5,6,7,8"
Возможно, вы захотите добавить дополнительную проверку для случаев, например, если середина строки находится в пределах последней строки или если используемый разделитель строк отличается от \r\n
.
Мне это нравится, это быстро и просто и не требует цикла, как моя идея.
Учитывая, что входная строка может иметь разную длину, может быть лучше группировать запросы до известной длины, а не просто разделять их пополам.
int REQUEST_SIZE = 1024;
string requestDelimiter = "\r\n";
int requestStart = 0;
int requestEnd = 0;
while(requestStart < dataByte.Length)
{
// Sending loop
int batchLength = requestStart+REQUEST_SIZE;
if (requestStart+batchLength > dataByte.Length)
{
// Cover for when the end of the string exceeds batchLength
// Ensure that the batchLength is adjusted to be within the string length
batchLength = dataByte.Length - requestStart;
}
requestEnd = dataByte.IndexOf(requestDelimiter, batchLength, StringComparison.Ordinal);
var requestData = dataByte.Substring(requestStart, requestEnd - requestStart);
// TODO: process requestData
requestStart = requestEnd;
}
Приведенный выше код разбивает запрос на блоки по 1024 символа.
Обратите внимание: непроверенный код - возможны опечатки.
почему вышеупомянутый ответ ломается, я попробовал его на строке, которая на картинке в вопросе, и она сработала
Я не могу припомнить, если batchLength = dataByte.Length - requestStart;
должен быть batchLength = dataByte.Length - requestStart -1;
. Но как я уже сказал - непроверенный код. Это скорее доказательство концепции, чем проверенный образец кода.
@AbdelrhmanElsaid Эту переменную я переименовал в batchLength. Исправлено.
пожалуйста, когда вы будете свободны, протестируйте свой код, потому что я получил исключение в `` `` var requestData = DataPart1.data.Substring (requestStart, requestEnd); `` System.ArgumentOutOfRangeException: 'Index and length must refer to a location within the string. Parameter name: length'
вторым аргументом string.Substring(int index, int length)
должна быть длина, а не индекс. То есть var rquestData = dataByte.Substring(requestStart, requestEnd - requestStart);
пожалуйста, опубликуйте код, который вы пробовали!