#c# #asp.net #string #for-loop
Вопрос:
Я пытаюсь получить подстроку из строки ответа, если длина ответа больше указанной, и пролистать ее. Мой код:
string response = //response from API
if (response.Length > 4096)
{
for (int i = 0; i < response.Length; i = 4096)
{
string rplymsg = response.Substring(i, 4095);
//other code using rplymsg
}
}
else
{
//other code using response
}
Я пробовал со струной.Метод подстроки, и он возвращает подстроку заданной длины при отладке, но фактическая длина подстроки больше. (Я проверил, вставив подстроку в notepad .)
Я думаю, что проблема в том, что response
строка и подстрока rplymsg
содержат новые строки n
. Есть ли какое-либо решение или лучший способ получить количество строк, содержащих новые строки, чтобы я мог извлечь подстроку на основе этой длины.
Редактировать:
Например:
String value = "HinHello.";
int startIndex = 0;
int length = 4;
String substring = value.Substring(startIndex, length);
Console.WriteLine(substring);
// Output:
// Hi
// H
// Expected output:
// Hin
Комментарии:
1. Почему вы получаете только 4095 символьных подстрок вместо 4096?
2. Если вы хотите извлекать данные из HTML, то что-то вроде пакета Html Agility Pack может сделать это намного проще для вас.
3. Вы создаете новую строку в своем цикле for. Верна ли ваша логика? Если вы хотите получить подстроку с самого начала, вы должны передать 0 в качестве первого параметра.
4. Похоже, notepad считает 2 символа для каждого разрыва строки… У вас есть разница в 37 символов между длиной кода и длиной в Notepad , и у вас всего 38 строк в Notepad . Я думаю, что вы должны полагаться на длину, которую вы получаете в коде, а не полагаться на редактор…
5. @phuzi Количество символов в строке
rplymsg
Ответ №1:
Если вы хотите сохранить символы новой строки, если жало меньше, чем вы ограничиваете размер 4096, то я думаю, что вам следует разделить строку на этот символ, но вместо того, чтобы просто String.Substring(...)
рассмотреть возможность использования String.Split(...)
, а также обработки массива строк, возвращенных из него. например:
string response = "abcdnefghnijklmnopnrstn";
var maxLength = 5;
var delimiter = new char[]{'n'};
var strings = response.Split(delimiter, StringSplitOptions.None);
foreach(var s in strings)
{
var delimited = s 'n';//add newline as Split removes them from the result
if(delimited.Length>maxLength)
{
var sub = delimited;
while(sub.Length>maxLength)
{
var p = sub.Substring(0, maxLength-1);
Console.WriteLine($"partial :{p}");
sub = sub.Remove(0,maxLength-1);
}
Console.WriteLine($"end :{sub}");
}
else
{
Console.WriteLine($"original :{delimited}");
}
}
Этот код не совсем там, так как он все равно выведет дополнительное сообщение, но он должен дать вам представление ( Console.WriteLine
заменяя ваш код обработки.
Ответ №2:
Ваш скриншот Notepad дает объяснение.
Оригинальный текст внутри .Net использует только линейные каналы, но ваш Блокнот настроен (в правом нижнем углу) на использование стиля Windows (CR LF). Это означает, что если вы вставите некоторый текст в это окно (что может быть доказано тем фактом, что ваше имя файла новое 1 с красным значком), оно автоматически будет преобразовано в текущий стиль. И это означает, что Notepad добавляет CR перед каждым LF и увеличивает длину текста.
Не могли бы вы написать свой текст с .Зайдите в файл и откройте этот файл с помощью Notepad , вы увидите истинную длину. Так что ошибка не внутри .Net или Visual Studio. Вы предполагаете, что в Notepad будет то же самое, что и в Visual Studio.
Чтобы исправить это, щелкните правой кнопкой мыши в правом нижнем углу Notepad в стиле Windows и выберите UNIX. Notepad преобразует файл, и вы увидите ту же длину, что и в Visual Studio (если только исходный текст не смешивает стиль Windows и Unix).
Обновление о последнем примере
Пример работает полностью так, как ожидалось. У вас есть эта тестовая строка HinHello.
Если вы возьмете из него 4 символа, вы получите Hi
, LFи H
. Когда вы выведете эти четыре символа на консоль, она распечатает
Hi
H
Обратная косая черта в вашем коде-это escape-символ, который говорит .Обратите внимание, что следующий персонаж не является нормальным n. Вместо этого это должна быть строка, состоящая из одного символа. Вместо этого вы также можете протестировать HitHello
. Это означало бы поместить таблицу между двумя словами.
Поэтому вам всегда нужно действительно заботиться о том, как визуализируется данный текст. Если вы посмотрите строковую переменную в окне просмотра в Visual Studio, вы увидите что-то вроде HinHello
визуализации пробелов, но если вы нажмете на шпионское стекло, вы увидите текст без n
, но с реальным разрывом строки.
Комментарии:
1. Не могли бы вы наконец помочь мне с моим отредактированным примером?
2. @HarshadRaval Обновил мой ответ.
3. Я обрабатываю эту подстроку в другом месте, и они обрабатываются
HinHello
как 9 символов. Как с этим бороться?4. Тогда возникает вопрос: что они делают в своем коде?