Изменить код программы - C#
Формулировка задачи:
Здравствуйте !
Было задание на вывод записей текстового файла с числом страниц больше указанного, напримев вводим 100 и выводятся все записи с числом страниц больше 100. Теперь аналогично надо вывести записи с годом в котором больше всего книг (строк).Т.е. сейчас это 2008 с 4 записями (текстовый файл может меняться). Как это сделать я не знаю. Буду благодарен полному коду выполненного задания. Просьба делать без LINQ, а с помощью цикла.
Вот текст текстового файла :
Адига Аравинд*Белый тигр* 2009*156
4Барнс Джулиан*3Артур и Джордж* 2008*120
Афлатуни Сухбат*Конкурс красоты* 2009*217
3Барнс Джулиан*4Артур и Джордж* 2008*120
Барнс Джулиан*Артур и Джордж* 2007*120
Барри Себастьян*Тайные скрижали* 2009*412
1Барнс Джулиан*1Артур и Джордж* 2008*120
2Барнс Джулиан*2Артур и Джордж* 2008*120
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace Lab8
{
struct Library//объявление структуры
{
public string avtor;
public string kniga;
public int god;
public int str;
public Library(string avtor, string kniga, int god, int str)
{
this.avtor = avtor;
this.kniga = kniga;
this.god = god;
this.str = str;
}
}
class Program
{
private static object book;
static StreamReader file() //открытие файла с записями о книгах
{
FileStream aFile = new FileStream("Library.txt", FileMode.OpenOrCreate);
StreamReader sr = new StreamReader(aFile, Encoding.Default);
return sr;
}
static void Programma(string strLine, StreamReader sr, int S, int N) //основная функция
{
System.IO.File.Delete("logs.txt"); //удаление файла
FileStream bFile = new FileStream("logs.txt", FileMode.OpenOrCreate); // файл для результатов
StreamWriter sw = new StreamWriter(bFile, Encoding.Default);//запись в файл
sw.WriteLine("Последний поисковый запрос:");
Library[] Bibl = new Library[N];
int i = 0;
char[] separator = { '*' };
while (strLine != null)//заполнение структуры информацией из файла
{
string[] Z = strLine.Split(separator);
Bibl[i].avtor = Z[0];
Bibl[i].kniga = Z[1];
Bibl[i].god = Convert.ToInt32(Z[2]);
Bibl[i].str = Convert.ToInt32(Z[3]);
i++;
strLine = sr.ReadLine();
}
sr.Close();
foreach (Library book in Bibl) //перебор всех записей о книгах
{
if (book.str > S)//цикл условия
{
sw.WriteLine("{0}, {1}, {2}, {3} ", book.avtor, book.kniga, book.god, book.str); //запись строки в файл
Console.WriteLine("{0}, {1}, {2}, {3} ", book.avtor, book.kniga, book.god, book.str); //вывод строки на экран
}
}
sw.Close(); //конец записи
}
static void Main(string[] args)
{
begin:
int N = System.IO.File.ReadAllLines("Library.txt").Length;//подсчитывает кол-во строк в файле=кол-ву записей в структуре
StreamReader sr = file();
string strLine = sr.ReadLine();
Console.WriteLine("Введите год:");
int S = Convert.ToInt32(Console.ReadLine()); //ввод кол-ва страниц
Console.WriteLine("Подходящие книги:");
Programma(strLine, sr, S, N);
Console.WriteLine();
Console.WriteLine("Выполнить новый поиск? Y - да");
string c = Console.ReadLine();
if (c == "Y") //цикл для повтора
{
sr.Close();
goto begin;
}
}
}
}Решение задачи: «Изменить код программы»
textual
Листинг программы
internal class Program
{
private static void Main(string[] args)
{
var allBooks = LoadFromFile("logs.txt");
var filteredBooks = FilterBooks(allBooks, book => book.PagesCount > 100);
foreach (var book in filteredBooks)
{
Console.WriteLine(book);
}
Console.ReadLine();
}
internal static IEnumerable<Book> FilterBooks(IEnumerable<Book> books, Func<Book, bool> predicate)
{
foreach (var book in books)
{
if (predicate(book))
yield return book;
}
}
internal static IEnumerable<Book> LoadFromFile(string filePath)
{
foreach (var line in File.ReadAllLines(filePath))
{
yield return Book.Parse(line);
}
}
}
class Book
{
private Book()
{
}
public string Title { get; private set; }
public string Author { get; private set; }
public int Year { get; private set; }
public int PagesCount { get; private set; }
internal static Book Parse(string str)
{
var parts = str.Split(new[] {'*'}, StringSplitOptions.RemoveEmptyEntries);
var book = new Book();
book.Author = parts[0];
book.Title = parts[1];
book.Year = Convert.ToInt32(parts[2]);
book.PagesCount = Convert.ToInt32(parts[3]);
return book;
}
public override string ToString()
{
return string.Format("Title:{0}, Author:{1}, Year:{2}, PagesCount:{3}", Title, Author, Year, PagesCount);
}
}