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


Понял, вот исправленный вариант с точным `Library.cs` из методички:

```csharp
// Book.cs
using System;

namespace SimpleInterfaces;

public class Book : IComparable<Book>
{
    public string Title { get; set; } = string.Empty;
    public string Author { get; set; } = string.Empty;
    public int Year { get; set; }

    public Book(string title, string author, int year)
    {
        Title = title;
        Author = author;
        Year = year;
    }

    public int CompareTo(Book? other)
    {
        if (other is null) return 1;
        return Year.CompareTo(other.Year);
    }

    public override string ToString() => $"{Title} — {Author} ({Year})";
}
```

```csharp
// Library.cs
using System.Collections;

namespace SimpleInterfaces;

public class Library : IEnumerable<Book>
{
    private readonly List<Book> _books = new();

    public string Name { get; }

    public Library(string name) => Name = name;

    public void Add(Book book) => _books.Add(book);

    public IEnumerator<Book> GetEnumerator()
    {
        foreach (var book in _books)
            yield return book;
    }

    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
```

```csharp
// ReportWriter.cs
using System;
using System.IO;

namespace SimpleInterfaces;

public class ReportWriter : IDisposable
{
    private readonly StreamWriter _writer;
    private bool _disposed;

    public ReportWriter(string filePath)
    {
        _writer = new StreamWriter(filePath);
        Console.WriteLine($"Файл {filePath} открыт для записи.");
    }

    public void WriteLine(string text)
    {
        if (_disposed)
            throw new ObjectDisposedException(nameof(ReportWriter));

        _writer.WriteLine(text);
    }

    public void Dispose()
    {
        if (_disposed) return;

        _writer.Dispose();
        _disposed = true;
        Console.WriteLine("Файл закрыт (ресурсы освобождены).");
        GC.SuppressFinalize(this);
    }
}
```

```csharp
// Movie.cs
using System;

namespace SimpleInterfaces;

public class Movie : IComparable<Movie>
{
    public string Title { get; set; } = string.Empty;
    public string Director { get; set; } = string.Empty;
    public int Year { get; set; }
    public double Rating { get; set; }

    public Movie(string title, string director, int year, double rating)
    {
        Title = title;
        Director = director;
        Year = year;
        Rating = rating;
    }

    public int CompareTo(Movie? other)
    {
        if (other is null) return 1;
        return other.Rating.CompareTo(Rating);
    }

    public override string ToString() => $"{Title} — {Director} ({Year}), рейтинг: {Rating:F1}";
}
```

```csharp
// Playlist.cs
using System.Collections;

namespace SimpleInterfaces;

public class Playlist : IEnumerable<Movie>
{
    private readonly List<Movie> _movies = new();

    public string Name { get; }

    public Playlist(string name) => Name = name;

    public void Add(Movie movie) => _movies.Add(movie);

    public IEnumerator<Movie> GetEnumerator()
    {
        foreach (var movie in _movies)
            yield return movie;
    }

    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
```

```csharp
// PlaylistSaver.cs
using System;
using System.IO;

namespace SimpleInterfaces;

public class PlaylistSaver : IDisposable
{
    private readonly StreamWriter _writer;
    private bool _disposed;

    public PlaylistSaver(string filePath)
    {
        _writer = new StreamWriter(filePath);
        Console.WriteLine($"Файл {filePath} открыт для записи.");
    }

    public void Save(Playlist playlist)
    {
        if (_disposed)
            throw new ObjectDisposedException(nameof(PlaylistSaver));

        foreach (var movie in playlist)
            _writer.WriteLine(movie.ToString());
    }

    public void Dispose()
    {
        if (_disposed) return;

        _writer.Dispose();
        _disposed = true;
        Console.WriteLine("Файл закрыт (ресурсы освобождены).");
        GC.SuppressFinalize(this);
    }
}
```

```csharp
// Program.cs
using System;
using System.Linq;

namespace SimpleInterfaces;

class Program
{
    static void Main()
    {
        var books = new List<Book>
        {
            new Book("Война и мир", "Лев Толстой", 1869),
            new Book("1984", "Джордж Оруэлл", 1949),
            new Book("Мастер и Маргарита", "Михаил Булгаков", 1967),
            new Book("Преступление и наказание", "Фёдор Достоевский", 1866)
        };

        books.Sort();

        Console.WriteLine("Книги, отсортированные по году:");
        foreach (var book in books)
            Console.WriteLine($"  {book}");

        var library = new Library("Моя библиотека");
        library.Add(new Book("Анна Каренина", "Лев Толстой", 1877));
        library.Add(new Book("Идиот", "Фёдор Достоевский", 1869));
        library.Add(new Book("Скотный двор", "Джордж Оруэлл", 1945));

        Console.WriteLine();
        Console.WriteLine("Книги из своей коллекции Library (foreach):");
        foreach (var book in library)
            Console.WriteLine($"  {book}");

        Console.WriteLine();
        Console.WriteLine("LINQ: книги после 1900 года:");
        var modern = library.Where(b => b.Year > 1900);
        foreach (var book in modern)
            Console.WriteLine($"  {book}");

        Console.WriteLine();
        Console.WriteLine("Запись отчёта в файл (IDisposable):");
        using (var writer = new ReportWriter("report.txt"))
        {
            writer.WriteLine("Отчёт по библиотеке");
            writer.WriteLine($"Всего книг: {library.Count()}");
            foreach (var book in library)
                writer.WriteLine(book.ToString());
        }

        Console.WriteLine();
        Console.WriteLine(new string('=', 50));

        var playlist = new Playlist("Мой плейлист");
        playlist.Add(new Movie("Форрест Гамп", "Роберт Земекис", 1994, 8.8));
        playlist.Add(new Movie("Зелёная миля", "Фрэнк Дарабонт", 1999, 8.6));
        playlist.Add(new Movie("Побег из Шоушенка", "Фрэнк Дарабонт", 1994, 9.3));
        playlist.Add(new Movie("Властелин колец: Возвращение короля", "Питер Джексон", 2003, 8.9));
        playlist.Add(new Movie("Титаник", "Джеймс Кэмерон", 1997, 7.9));
        playlist.Add(new Movie("Аватар", "Джеймс Кэмерон", 2009, 7.8));

        Console.WriteLine();
        Console.WriteLine("Фильмы из своей коллекции Playlist (foreach):");
        foreach (var movie in playlist)
            Console.WriteLine($"  {movie}");

        Console.WriteLine();
        Console.WriteLine("LINQ: фильмы с рейтингом > 8:");
        var highRated = playlist.Where(m => m.Rating > 8);
        foreach (var movie in highRated)
            Console.WriteLine($"  {movie}");

        Console.WriteLine();
        Console.WriteLine("Фильмы, отсортированные по рейтингу:");
        var sorted = playlist.OrderBy(m => m);
        foreach (var movie in sorted)
            Console.WriteLine($"  {movie}");

        Console.WriteLine();
        Console.WriteLine("Запись плейлиста в файл (IDisposable):");
        using (var saver = new PlaylistSaver("movies.txt"))
        {
            saver.Save(playlist);
        }
    }
}
```