Загрузка данных


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Xml.Serialization;
    using System.IO;
    using System.Xml.Linq;

    namespace FileWorkPractice
    {
        [Serializable]
        public class Person
        {
            public string Name { get; set; }

            public int[] Grades { get; set; } = new int[5];

            public double AverageGrade => Grades.Average();

            public Person() { }

            public Person(string name, params int[] grades)
            {
                Name = name;
                if (grades.Length == 5)
                    Array.Copy(grades, Grades, 5);
            }
        }

        class Program
        {
            static List<Person> LoadPeopleFromXml(string path)
            {
                try
                {
                    var serializer = new XmlSerializer(typeof(List<Person>));
                    using (var reader = new StreamReader(path))
                    {
                        return (List<Person>)serializer.Deserialize(reader);
                    }
                }
                catch
                {
                    try
                    {
                        XDocument doc = XDocument.Load(path);
                        var people = new List<Person>();
                        foreach (var el in doc.Descendants("Person"))
                        {
                            var person = new Person(
                                el.Element("Name")?.Value ?? "Без имени",
                                Convert.ToInt32(el.Element("Grades")?.Element("G1")?.Value ?? "0"),
                                Convert.ToInt32(el.Element("Grades")?.Element("G2")?.Value ?? "0"),
                                Convert.ToInt32(el.Element("Grades")?.Element("G3")?.Value ?? "0"),
                                Convert.ToInt32(el.Element("Grades")?.Element("G4")?.Value ?? "0"),
                                Convert.ToInt32(el.Element("Grades")?.Element("G5")?.Value ?? "0")
                            );
                            people.Add(person);
                        }
                        return people;
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine($"Ошибка загрузки данных: {ex.Message}");
                        return new List<Person>();
                    }
                }
            }

            static void Main(string[] args)
            {
                const string filePath = "people.xml";

                if (!File.Exists(filePath))
                {
                    Console.WriteLine($"Файл '{filePath}' не найден.");
                    return;
                }

                var students = LoadPeopleFromXml(filePath);

                if (students.Count == 0)
                {
                    Console.WriteLine("Список учеников пуст.");
                    return;
                }

                while (true)
                {
                    Console.Clear();
                    Console.WriteLine("=== Работа с файлом последовательного доступа ===");
                    Console.WriteLine("Выберите действие:");
                    Console.WriteLine("1. Показать самого лучшего ученика");
                    Console.WriteLine("2. Показать самого худшего ученика");
                    Console.WriteLine("3. Показать весь список");
                    Console.WriteLine("4. Показать учеников со средним баллом больше...");
                    Console.WriteLine("0. Выход");

                    switch (Console.ReadKey(true).KeyChar)
                    {
                        case '1':
                            ShowBestStudent(students);
                            break;
                        case '2':
                            ShowWorstStudent(students);
                            break;
                        case '3':
                            ShowAllStudents(students);
                            break;
                        case '4':
                            FilterByAverage(students);
                            break;
                        case '0':
                            return;
                    }

                    Console.WriteLine("\nНажмите любую клавишу для продолжения...");
                    Console.ReadKey();
                }
            }

            private static void ShowBestStudent(List<Person> list)
            {
                var best = list.OrderByDescending(p => p.AverageGrade).FirstOrDefault();
                if (best != null)
                {
                    PrintPersonDetails(best, "Самый лучший ученик:");
                }
            }

            private static void ShowWorstStudent(List<Person> list)
            {
                var worst = list.OrderBy(p => p.AverageGrade).FirstOrDefault();
                if (worst != null)
                {
                    PrintPersonDetails(worst, "Самый худший ученик:");
                }
            }

            private static void ShowAllStudents(List<Person> list)
            {
                Console.WriteLine("\nВесь список учеников:");
                Console.WriteLine("{0,-20} | {1,-6} | Оценки", "Имя", "Ср.балл");
                Console.WriteLine(new string('-', 45));
                foreach (var s in list.OrderByDescending(p => p.AverageGrade))
                {
                    Console.WriteLine("{0,-20} | {1,6:F2} | {2}", s.Name, s.AverageGrade,
                        string.Join(", ", s.Grades));
                }
            }

            private static void FilterByAverage(List<Person> list)
            {
                Console.Write("Введите минимальный средний балл: ");
                if (double.TryParse(Console.ReadLine(), out double threshold))
                {
                    var filtered = list.Where(p => p.AverageGrade > threshold)
                                       .OrderByDescending(p => p.AverageGrade)
                                       .ToList();

                    Console.WriteLine($"\nУченики со средним баллом выше {threshold}:");
                    if (filtered.Any())
                    {
                        ShowAllStudents(filtered);
                    }
                    else
                    {
                        Console.WriteLine("Таких учеников не найдено.");
                    }
                }
                else
                {
                    Console.WriteLine("Некорректный ввод числа.");
                }
            }

            private static void PrintPersonDetails(Person p, string title)
            {
                Console.WriteLine($"\n{title}");
                Console.WriteLine($"Имя: {p.Name}");
                Console.WriteLine($"Оценки: {string.Join(", ", p.Grades)}");
                Console.WriteLine($"Средний балл: {p.AverageGrade:F2}");
            }
        }
    }