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 шт):

Автор решения: Vr1cK

Можно использовать не 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;
}

→ Ссылка
Автор решения: aepot

Ну вот например полностью контроллируемый ввод с филтрацией управляющих символов на базе 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().

→ Ссылка