C#. Как ограничить количество элементов в массиве char(есть ли более оптимизированный способ)?
Если я ввожу массив вот так:
char[] charArray = new char[11];
charArray = Console.ReadLine().ToCharArray();
Я могу ввести строку больше диапазона и она её запомнит добавив новые элементы. В том же C++20 вводя строку через cin она запомнит только первые 10 символов(если столько нет, то запомнит столько сколько есть). Как сделать также в C#?
char[] charArray = new char[11];
Я думал, что добавив = new char[11] я ограничу размер массива, а получилось совсем другое(если все элемента массива не будут заполнены, то выдаст ошибка).
Я сделал вот такую рабочую функцию, но хочу узнать есть ли более оптимизированный способ.
char[] charArray = CharRaz(10);
char[] CharRaz(int razmer)
{
char[] charArray = Console.ReadLine().ToCharArray();
if (charArray.Length <= razmer) return charArray;
charArray = String.Concat<char>(charArray).Substring(0, razmer).ToCharArray();
return charArray;
}
Есть ли более оптимизированный способ(использовать переменные string нельзя)?
Ответы (2 шт):
Можно использовать не ReadLine()
, а Read()
, в цикле до нужного количества, и каждый введенный символ добавлять в массив по индексу.
Так символы будут поочередно записываться, не будет создания новой строки, не будет лишних преобразований.
К тому же количество элементов может и не достигать максимальной длины массива, если добавить символ, по которому запись прекратится.
В случае ниже ввод прекратится после нажатия Enter, но вводить можно сколько угодно.
P.S. Работоспособен код только в Visual Studio для Windows, в остальном под вопросом.
int n = 11;
char temp;
char[] charArray = new char[n];
for(int i = 0; i < n; i++){
temp = (char)Console.Read();
if(temp == '\n') break;
charArray[i] = temp;
}
Ну вот например полностью контроллируемый ввод с филтрацией управляющих символов на базе Console.ReadKey()
.
private static char[] ReadChars(int length)
{
char[] buffer = new char[length];
ConsoleKey key;
int i = 0;
do
{
ConsoleKeyInfo keyInfo = Console.ReadKey(true);
key = keyInfo.Key;
if (key == ConsoleKey.Backspace && i > 0)
{
Console.Write("\b \b");
i--;
}
else if (!char.IsControl(keyInfo.KeyChar))
{
Console.Write(keyInfo.KeyChar);
buffer[i++] = keyInfo.KeyChar;
}
} while (key != ConsoleKey.Enter && i < length);
Console.WriteLine();
return buffer[..i];
}
Проверяем
char[] chars = ReadChars(11);
Console.WriteLine(chars.Length);
Console.WriteLine(new string(chars));
Вывод в консоль
hello world
11
hello world
Если ввести 11, то Enter жать не нужно
А вот если ввести меньше и нажать Enter
hello
5
hello
Backspace работает как в ReadLine()
.