Загрузка данных
Готовый код практической работы (часть с книгами + самостоятельное задание с фильмами).
Структура проекта `SimpleInterfaces`:
```
SimpleInterfaces/
├── Book.cs
├── Library.cs
├── ReportWriter.cs
├── Movie.cs
├── Playlist.cs
├── PlaylistSaver.cs
├── Program.cs
└── SimpleInterfaces.csproj
```
---
### Book.cs
```csharp
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})";
}
```
### Library.cs
```csharp
using System.Collections;
using System.Collections.Generic;
namespace SimpleInterfaces;
public class Library : IEnumerable<Book>
{
private readonly List<Book> _books = new();
public void Add(Book book) => _books.Add(book);
public IEnumerator<Book> GetEnumerator() => _books.GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
```
### ReportWriter.cs
```csharp
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);
}
}
```
### Movie.cs (самостоятельная работа)
```csharp
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; } // 0–10
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}";
}
```
### Playlist.cs
```csharp
using System.Collections;
using System.Collections.Generic;
namespace SimpleInterfaces;
public class Playlist : IEnumerable<Movie>
{
private readonly List<Movie> _movies = new();
public void Add(Movie movie) => _movies.Add(movie);
public IEnumerator<Movie> GetEnumerator() => _movies.GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
```
### PlaylistSaver.cs
```csharp
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);
}
}
```
### Program.cs (итоговый)
```csharp
using System;
using System.Linq;
namespace SimpleInterfaces;
class Program
{
static void Main()
{
Console.WriteLine("=== Часть 1: Книги (из практической работы) ===\n");
// --- IComparable<Book> + сортировка ---
var books = new List<Book>
{
new Book("Война и мир", "Лев Толстой", 1869),
new Book("1984", "Джордж Оруэлл", 1949),
new Book("Мастер и Маргарита", "Михаил Булгаков", 1967),
new Book("Преступление и наказание", "Фёдор Достоевский", 1866)
};
books.Sort(); // работает благодаря IComparable<Book>
Console.WriteLine("Книги, отсортированные по году:");
foreach (var book in books)
Console.WriteLine($" {book}");
// --- IEnumerable<Book> ---
var library = new Library();
library.Add(new Book("Анна Каренина", "Лев Толстой", 1877));
library.Add(new Book("Идиот", "Фёдор Достоевский", 1869));
library.Add(new Book("Скотный двор", "Джордж Оруэлл", 1945));
Console.WriteLine("\nКниги из своей коллекции Library (foreach):");
foreach (var book in library)
Console.WriteLine($" {book}");
// --- LINQ «бесплатно» ---
Console.WriteLine("\nLINQ: книги после 1900 года:");
var modern = library.Where(b => b.Year > 1900);
foreach (var book in modern)
Console.WriteLine($" {book}");
// --- IDisposable ---
Console.WriteLine("\nЗапись отчёта в файл (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("\n" + new string('=', 50));
Console.WriteLine("=== Часть 2: Фильмы (самостоятельная работа) ===\n");
// 1. Создаём плейлист и выводим все фильмы через foreach
var playlist = new Playlist();
playlist.Add(new Movie("Inception", "Christopher Nolan", 2010, 8.8));
playlist.Add(new Movie("The Matrix", "Lana Wachowski", 1999, 8.7));
playlist.Add(new Movie("Interstellar", "Christopher Nolan", 2014, 8.6));
playlist.Add(new Movie("Pulp Fiction", "Quentin Tarantino", 1994, 8.9));
playlist.Add(new Movie("The Room", "Tommy Wiseau", 2003, 3.7));
playlist.Add(new Movie("Parasite", "Bong Joon-ho", 2019, 8.5));
Console.WriteLine("1. Все фильмы (foreach):");
foreach (var movie in playlist)
Console.WriteLine($" {movie}");
// 2. Фильмы с рейтингом > 8 через LINQ
Console.WriteLine("\n2. Фильмы с рейтингом > 8 (LINQ Where):");
var highRated = playlist.Where(m => m.Rating > 8);
foreach (var movie in highRated)
Console.WriteLine($" {movie}");
// 3. Отсортировать и вывести (по рейтингу убывание)
Console.WriteLine("\n3. Отсортированные по рейтингу (убывание):");
var sorted = playlist.OrderBy(m => m); // использует CompareTo
foreach (var movie in sorted)
Console.WriteLine($" {movie}");
// 4. Сохранить в файл movies.txt
Console.WriteLine("\n4. Сохранение плейлиста в movies.txt:");
using (var saver = new PlaylistSaver("movies.txt"))
{
saver.Save(playlist);
}
Console.WriteLine("\nГотово!");
}
}
```
### SimpleInterfaces.csproj
```xml
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
```
---
**Что проверяется в самостоятельной работе:**
1. `foreach` по `Playlist` (благодаря `IEnumerable<Movie>`)
2. LINQ `Where(m => m.Rating > 8)` (бесплатно, т.к. есть `IEnumerable`)
3. Сортировка через `OrderBy` / `Sort` (благодаря `IComparable<Movie>` — по рейтингу **по убыванию**)
4. `using` + `PlaylistSaver` сохраняет плейлист в `movies.txt` и гарантированно закрывает файл
Все файлы лежат в `/home/workdir/artifacts/SimpleInterfaces/`.