Почему записи не отображаются?

string[] recordes = { };

while (true)
{
    Console.WriteLine("Добро пожаловать в консольный блокнот!");
    Console.WriteLine("\nВведите команду:\nСоздать запись - 1\nРедактировать запись - 2\nПосмотреть записи - 3\nВыход - 4");

    int userComand = Convert.ToInt32(Console.ReadLine());

    if (userComand == 1)
    {
        Console.Write("Введите содержание записи: ");

        string record = Console.ReadLine();
        recordes.Append(record);

        Console.WriteLine();
        Console.WriteLine();
    }
    else if (userComand == 2)
    {

    }
    else if (userComand == 3)
    {
        for (int i = 0; i < recordes.Length; i++)
        {
            Console.WriteLine($"Запись номер: {recordes[i]}.");
        }
    }
    else
    {
        break;
    }
}

Я создаю записи, а потом нажимаю команду 3,но записи не отоброжаются.


Ответы (2 шт):

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

Append не изменяет сам массив, а лишь возвращает новый набор IEnumerable, поэтому строчку recordes.Append(record); меняем на recordes = recordes.Append(record).ToArray();, Console.WriteLine($"Запись номер: {recordes[i]}.");- на Console.WriteLine($"Запись номер {i}: {recordes[i]}.");

Я бы для таких целей вместо string[] использовал более подходящие структуры данных, например List<string>

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

Ответ на вопрос

recordes.Append(record) создаёт новый итератор IEnumerable исходного массива с новым добавленным элементом, а не добавляет значение в исходный массив.

В любом случае стандартные массивы не рекомендуется использовать для перечислений неизвестных размеров. Если же вам надо постоянно добавлять или удалять элементы, то лучше использовать тип List<T>:

List<string> records = new();

Добавлять записи можно через метод List<T>.Add(T element):

records.Add(record);

Ну а T[].Length заменяется на List<T>.Count:

for (int i = 0; i < records.Count; i++) {/*...*/}

Общие замечания по коду

Первым делом вынесем все команды в отдельные методы:

void AddRecord() {/*...*/}
void ShowRecords() {/*...*/}

Теперь вместо кучи условий создадим словарь команд формата id: функция и запишем в неё все наши команды с соответствующими функциями:

Dictionary<int, Action> userCommandActions = new()
{
    { 1, AddRecord }, // Команда для добавления записи
    { 2, () => { } }, // Пустая команда (ничего не делающая)
    { 3, ShowRecords }, // Команда для отображения записей
};

Теперь при вводе новой команды мы вначале проверяем, находится ли команда в списке:

if (!userCommandActions.ContainsKey(userComand)) // Если команда не найдена
    break; // Завершаем цикл

И если находим, то получаем и вызываем её:

var command = userCommandActions[userComand]; // Получаем команду
command(); // Вызываем

По хорошему конечно стоит сами записи вынести в отдельный объект, но так как вы скорее всего не знакомы с ООПом, то пока это вам рано

Итого в итоге получаем следующий код:

List<string> records = new();

Dictionary<int, Action> userCommandActions = new()
{
    { 1, AddRecord },
    { 2, () => { } },
    { 3, ShowRecords },
};

while (true)
{
    Console.WriteLine("Добро пожаловать в консольный блокнот!");
    Console.WriteLine("\nВведите команду:\nСоздать запись - 1\nРедактировать запись - 2\nПосмотреть записи - 3\nВыход - 4");

    var inputLine = Console.ReadLine();
    if (inputLine is null)
        break;

    int userComand = Convert.ToInt32(inputLine);

    if (!userCommandActions.ContainsKey(userComand)) // Если команда не найдена
        break; // Завершаем цикл

    var command = userCommandActions[userComand]; // Получаем команду
    command(); // Вызываем
}

void AddRecord()
{
    Console.Write("Введите содержание записи: ");

    string record = Console.ReadLine() ?? return;
    records.Add(record);
    Console.Write("\n\n");
}

void ShowRecords()
{
    for (int i = 0; i < records.Count; i++)
        Console.WriteLine($"Запись №{i}: {records[i]}.");
}
→ Ссылка