Уникальное имя переменных в цикле c#

Я создаю лист направлений List<Direction> directions = new List<Direction>();, который содержит в себе объекты класса Direction, затем я в этот этот лист добавляю направление AddDirection(directions);, например "Владивосток-Москва" . Потом я создаю поезд List<Carriage> train1 = new List<Carriage>();, состоящий из объектов класса Carriage.

Соответственно, при создании нового направления AddDirection(directions); мне нужно создать новый поезд, но в данном коде я могу добавлять поезд только вручную, создавая новый лист. Но я хочу чтобы названия создавались сами, т.е. скорее всего это будет какой-то цикл, который создаёт новый лист, но уже с другим названием, например не train1, а train2, где 2 должна добавляться сама. Можно создать counter и при создании направления делать инкремент. Но как добавлять итератор i к строке не знаю. Как такое можно реализовать? Есть задумка,можно создать ещё один лист, который содержит в себе листы train, но как-то слишком громоздко уже получается

class Program
{

    static void Main(string[] args)
    {
        Random rand = new Random();
        List<Direction> directions = new List<Direction>();

        Console.WriteLine("Добавить новое направление");
        AddDirection(directions);                    //создаём направление
        List<Carriage> train1 = new List<Carriage>(); //создаём поезд
        AddCarriage(train, rand);                    //создаём несколько вагонов для поезда
        AddCarriage(train, rand); 
        AddCarriage(train, rand); 

    }

    static void AddCarriage(List<Carriage> train, Random rand)
    {
        train.Add(new Carriage(rand));
    }
    static void AddDirection(List<Direction> directions)
    {
        directions.Add(new Direction(Console.ReadLine()));
    }
}

class Direction
{
    public string Name { get; private set; }

    public Direction(string name)
    {
        Name = name;
    }
}
class Carriage
{
    public int Capacity { get; private set; }

    public Carriage(Random rand)
    {
        Capacity = rand.Next(30, 50);
    }
}

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

Автор решения: Andrei Khotko

Если вы хотите создавать список поездов динамически, то вам нужен все тот же List. Но из-за того, что у вас поезд - это список вагонов, то у вас получится такая вот каша:

List<Carriage> train1 = new List<Carriage>();
List<List<Carriage>> trainList = new List<List<Carriage>>();
trainList.Add(train1);

Предлагаю вам сделать отдельный класс Train для поездов, тогда такой вложенности можно избежать. Ожидаемое вами поведение может быть реализовано примерно так (при добавлении направления создаем поезд с тремя вагонами):

class Program
{
    static void Main(string[] args)
    {
        Random rand = new Random();
        List<Direction> directions = new List<Direction>();
        var trains = new List<Train>();

        do
        {
            Console.WriteLine("Добавить новое направление");

            var direction = new Direction(Console.ReadLine());
            var train = new Train(direction);
            train.AddCarriage(new Carriage(rand));
            train.AddCarriage(new Carriage(rand));
            train.AddCarriage(new Carriage(rand));

            trains.Add(train);
            directions.Add(direction);
            
            Console.WriteLine("Нажмите 'q' для завершения или любую другую клавишу, чтобы продолжить");
        } while (Console.ReadKey().Key != ConsoleKey.Q);

        Console.ReadLine();
    }
}

class Direction
{
    public string Name { get; private set; }

    public Direction(string name)
    {
        Name = name;
    }
}
class Carriage
{
    public int Capacity { get; private set; }

    public Carriage(Random rand)
    {
        Capacity = rand.Next(30, 50);
    }
}

class Train
{
    private readonly List<Carriage> _carriages;

    public Direction Direction { get; }
    public IReadOnlyCollection<Carriage> Carriages
    {
        get { return _carriages; }
    }

    public Train(Direction direction)
    {
        Direction = direction;
        _carriages = new List<Carriage>();
    }

    public void AddCarriage(Carriage carriage)
    {
        _carriages.Add(carriage);
    }
}
→ Ссылка