Научиться использовать LINQ (Language Integrated Query) для работы с коллекциями данных в C#.
Освоить базовые операции: фильтрацию, сортировку, агрегацию и преобразование данных.
Понять принципы отложенного выполнения запросов.
Необходимо реализовать класс StudentService
, который будет обрабатывать данные о студентах (имя, факультет, оценки) с помощью LINQ.
Данные представлены коллекцией объектов Student
:
public class Student
{
public string Name { get; set; }
public string Faculty { get; set; }
public List<int> Grades { get; set; }
}
Ознакомбтесь с источниками, указанными в списке литературы, который указан в конце данного задания.
Напишите модульные тесты (xUnit) в проекте task02tests для проверки корректности работы метода.
public class StudentServiceTests
{
private List<Student> _testStudents;
private StudentService _service;
public void StudentServiceTests()
{
_testStudents = new List<Student>
{
new() { Name = "Иван", Faculty = "ФИТ", Grades = new List<int> { 5, 4, 5 } },
new() { Name = "Анна", Faculty = "ФИТ", Grades = new List<int> { 3, 4, 3 } },
new() { Name = "Петр", Faculty = "Экономика", Grades = new List<int> { 5, 5, 5 } }
};
_service = new StudentService(_testStudents);
}
[Fact]
public void GetStudentsByFaculty_ReturnsCorrectStudents()
{
var result = _service.GetStudentsByFaculty("ФИТ").ToList();
Assert.AreEqual(2, result.Count);
Assert.IsTrue(result.All(s => s.Faculty == "ФИТ"));
}
[Fact]
public void GetFacultyWithHighestAverageGrade_ReturnsCorrectFaculty()
{
var result = _service.GetFacultyWithHighestAverageGrade();
Assert.AreEqual("Экономика", result);
}
}
В данном коде реализовано два теста. Необходимо реализовать недостающие по аналогии.
Допишите реализацию для следующего класса:
public class StudentService
{
private readonly List<Student> _students;
public StudentService(List<Student> students) => _students = students;
// 1. Возвращает студентов указанного факультета
public IEnumerable<Student> GetStudentsByFaculty(string faculty)
=> реализация;
// 2. Возвращает студентов со средним баллом >= minAverageGrade
public IEnumerable<Student> GetStudentsWithMinAverageGrade(double minAverageGrade) => реализация;
// 3. Возвращает студентов, отсортированных по имени (A-Z)
public IEnumerable<Student> GetStudentsOrderedByName()
=> реализация;
// 4. Группировка по факультету
public ILookup<string, Student> GroupStudentsByFaculty()
=> реализация;
// 5. Находит факультет с максимальным средним баллом
public string GetFacultyWithHighestAverageGrade()
=> реализация;
}
В реализации нужно использовать только LINQ. Нельзя использовать циклы!
Официальная документация Microsoft по LINQ
Основные концепции и руководство по Language Integrated Query
Учебник Microsoft: Работа с LINQ
Практические руководства по использованию LINQ в C#
Справочник по методам Enumerable
Документация всех методов расширения LINQ для IEnumerable
Официальная документация NUnit
Руководство по фреймворку для модульного тестирования
Moq Quickstart Guide
Быстрый старт с библиотекой для создания mock-объектов
C# Programming Guide
Общее руководство по программированию на C# от Microsoft