Добавить к строке её порядковый номер C#

Только недавно начал изучать C#, столкнулся с некоторыми трудностями.

Есть список строковых значений, который нужно вывести на экран в элемент listbox. Также есть массив, в который эти строки добавляются, после чего выводятся на экран.

В программе есть два класса - абстрактный и производный. В абстрактном классе есть два метода: первый содержит список всех строковых значений, а второй добавляет все эти значения в массив и выводит их на экран. В производном классе массив сортируется.

Мне необходимо, чтобы каждой строке в массиве присваивался свой порядковый номер и выводился вместе со значением этой строки. Реализовать это необходимо с помощью отдельного метода в абстрактном классе, который будет возвращать нумерованный список элементов.

Как можно реализовать данную функцию? Уже многое перепробовал, но так и не нашел решение. Код абстрактного класса и методов прилагаю.

abstract public class BaseNotes //Базовый класс со списком элементов
{
    protected ArrayList notes = new ArrayList(); //Создаем новый защищенный от изменения список элементов notes

    //Открытые методы класса
    //метод заполнения массива строк (конструктор класса)
    public BaseNotes()
    {
        notes.Add("История");
        notes.Add("Философия");
        notes.Add("Иностранный язык");
        notes.Add("Экономическая теория");
        notes.Add("Математика");
    }

    //Метод объединения значений списка в массив
    public string[] GetMyList()
    {
        string[] ArrStr = new string[notes.Count]; //Создание массива размеров с количестом элементов
        notes.CopyTo(ArrStr); //Копирование всех строк в новый массив
        return ArrStr; //Возврат значений массива
    }
}

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

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

Не используйте ArrayList, Array и другие классы из System.Collections, это всего-лишь наследие древнего шарпа, используйте обобщенные коллекции из System.Collections.Generic.

Реализовать можно то что вам надо с помощью энумератора, и не придется клонировать массив, что само по себе - неэффективное занятие.

abstract public class BaseNotes
{
    protected List<string> notes = new List<string>();

    public BaseNotes()
    {
        notes.Add("История");
        notes.Add("Философия");
        notes.Add("Иностранный язык");
        notes.Add("Экономическая теория");
        notes.Add("Математика");
    }

    public IEnumerable<string> EnumerateNotes()
    {
        int i = 1;
        // здесь именно foreach, а не for, потому что он защищен от случаев, когда список будет изменен во время энумерации
        // будет выброшено исключение, что в принципе правильно и защитит разработчика от лишних ошибок
        foreach (string note in notes)
        {
            yield return $"{i++}. {note}";
        }
    }
}

public class Notes : BaseNotes
{

}

class Program
{
    private static void Main(string[] args)
    {
        Notes notes = new Notes();
        foreach (string note in notes.EnumerateNotes())
        {
            Console.WriteLine(note);
        }
        Console.ReadKey();
    }
}

Вывод в консоль

1. История
2. Философия
3. Иностранный язык
4. Экономическая теория
5. Математика

Либо можно более элегантно написать метод EnumerateNotes() с помощью Linq

public IEnumerable<string> EnumerateNotes()
{
    return notes.Select((note, i) => $"{i + 1}. {note}");
}

Если вам принципиально вернуть массив строк, то можете так

public string[] GetNotes()
{
    return notes.Select((note, i) => $"{i + 1}. {note}").ToArray();
}
→ Ссылка