Идея алгоритма. Расписание на неделю C#

Написать программу, работающую с файлом из записей следующей типизации:

int group; //Номер группы
char subGroup; //Подгруппа 0-обе, 1-а , 2-б
char day; //День недели 1-понедельник и тд
char lenta; //Номер ленты
string subject; //Предмет

Наличие конкретной записи в файле указывает на то, что у подгруппы а,б или обоих в день day , лентой-lenta по рассписанию предмет-subject. Программа должна иметь возможность создавать файл , а также:

а) Для конкретного дня недели, номер группы, подгруппы и ленты выдавать какой предмет должен быть по расписанию(если занятия нет , то вывести сообщение об этом)

b)Для заданной группы и подгруппы составить расписание на неделю

Я бы хотел попросить помощи , в плане , направить в нужном направлении по ходу решения. Уже 3 дня бьюсь над задачкой. В голове крутиться только реализация через трехмерный масив. Буду благодарен за помощь

 class Program
    {
        struct User
        {
            public int group;
            public char subGroup;
            public char day;
            public char lenta;
            public string subject;
            

            public void DisplayInfo()
            {

                string info = ($"Группа: {group}" +
                                  $"Подгруппа: {subGroup}  " +
                                  $"День: {day} " +
                                  $"Лента: {lenta}" +
                                  $"Предмет: {subject}");
                Console.WriteLine(info);
            }
        }

        static void Main(string[] args)
        {
            User student;
            Console.Write("Введите номер вашей группы: ");
            student.group = int.Parse(Console.ReadLine());
            Console.Write("Введите номер вашей подгруппы: ");
            student.subGroup = char.Parse(Console.ReadLine());
            Console.Write("Укажите номер дня в неделе: ");
            student.day = char.Parse(Console.ReadLine());

            //Создание трехмерного масива для расписания

            int[][][] firstArray = new int[3][][];
            for (int i = 0; i < 3; i++)
            {
                int[][] secondArray = new int[7][];
                for (int j = 0; j < 7; j++)
                {
                    int[] thirdArray = new int[7];
                    for (int k = 0; k < 7; k++)
                    {
                        thirdArray[k] = 0;
                    }
                    secondArray[j] = thirdArray;
                }
                firstArray[i] = secondArray;
            }

            Console.ReadKey();

        }

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

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

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

Вот например дневное расписание на один день для одной группы и подгруппы

struct Schedule
{
    public string Group { get; set; }
    public string SubGroup { get; set; }
    public DateTime Day { get; set; }
    public Dictionary<TimeSpan, string> DayShedule { get; set; }

    public override string ToString()
    {
        StringBuilder sb = new StringBuilder();
        sb.Append(Day.ToString("dd.MM.yyyy")).Append(' ');
        sb.Append(Group).Append('-').AppendLine(SubGroup);
        foreach (var pair in DayShedule)
        {
            sb.Append(pair.Key.ToString(@"hh\:mm")).Append(' ').AppendLine(pair.Value);
        }
        return sb.ToString();
    }
}

Может я переусложнил, но вы удилите лишнее, если надо. Я сделал именно так для наглядности.

Всё, теперь это можно хранить в списке и делать выборку с помощью System.Linq.

Давайте создадим список и добавим в него данные

List<Schedule> schedules = new List<Schedule>();

schedules.Add(new Schedule
{ 
    Group = "Ы", 
    SubGroup = "15", 
    Day = DateTime.Parse("15.01.2020"),
    DayShedule = new Dictionary<TimeSpan, string> 
    {
        [TimeSpan.FromHours(9)] = "Алгебра",    
        [TimeSpan.FromHours(11)] = "Физика",    
        [TimeSpan.FromHours(13)] = "Экономика",    
        [TimeSpan.FromHours(15)] = "Геометрия",
    }
});

schedules.Add(new Schedule
{
    Group = "Ы",
    SubGroup = "15",
    Day = DateTime.Parse("16.01.2020"),
    DayShedule = new Dictionary<TimeSpan, string>
    {
        [TimeSpan.FromHours(11)] = "Английский",
        [TimeSpan.FromHours(15)] = "Физкультура",
    }
});

schedules.Add(new Schedule
{
    Group = "Б",
    SubGroup = "15",
    Day = DateTime.Parse("16.01.2020"),
    DayShedule = new Dictionary<TimeSpan, string>
    {
        [TimeSpan.FromHours(11)] = "Английский",
        [TimeSpan.FromHours(15)] = "Физкультура",
    }
});

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

var selection = schedules.Where(x => x.Group == "Ы");
foreach (Schedule s in selection)
    Console.WriteLine(s);

Если вам незнаком Linq, то можно выбрать вот так

foreach (Schedule s in schedules)
{
    if (s.Group == "Ы")
        Console.WriteLine(s);
}

Вывод будет такой

15.01.2020 Ы-15
09:00 Алгебра
11:00 Физика
13:00 Экономика
15:00 Геометрия

16.01.2020 Ы-15
11:00 Английский
15:00 Физкультура

Можно таким же образом выбирать по временному промежутку, датам, подгруппам, времени, предметам, как угодно.

→ Ссылка