Добавить к строке её порядковый номер 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 шт):
Не используйте 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();
}