@RKey_Prog

Как в C# организовать поиск по файлу и присвоение строк полям объекта?

Здравствуйте. Есть класс, который создает объекты книг, с полями: авторы (массив), название, издательство, год издания, дата выдачи книги на руки, срок возврата. Сделал загрузку в файл всех этих данных, код приведу ниже. Вопрос заключается в том, как организовать вывод этой информации хотя бы по названию, далее усовершенствую. Лучше искать строку в файле и потом следующие 5 строк выводить, или весь файл перекинуть в массив объектов и уже там осуществлять поиск?
Вот код, который уже есть (кстати, все на форме):
namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        string path = @"U:\Study\Практика по программированию\Прога\Date.txt";

        public Form1()
        {
            InitializeComponent();
        }

        public void button1_Click(object sender, EventArgs e)
        {
            Book book = new Book(textBox1.Text.Split(' '), textBox2.Text, textBox3.Text, Int32.Parse(textBox4.Text), dateTimePicker1.Value, dateTimePicker2.Value);
            GetInfo(book);

            using (FileStream fstream = new FileStream($"{path}", FileMode.Append, FileAccess.Write))
            {
                string Author = "";
                for (int i = 0; i < book.Author_name.Length; i++)
                {
                    Author += book.Author_name[i].ToString() + " ";
                }
                byte[] input = Encoding.Default.GetBytes(Author + "\n" + book.Book_name.ToString() + "\n" + book.Publishing_house.ToString() + "\n" + book.Year.ToString() + "\n" + book.Date_of_issue.ToString() + "\n" + book.Repayment_period.ToString() + "\n" + "\n");
                fstream.Write(input, 0, input.Length);
            }
        }

        public void button2_Click(object sender, EventArgs e)
        {
            Book book = new Book();

            string text = "";
            using (StreamReader fs = new StreamReader(path))
            {
                while (true)
                {
                    // Читаем строку из файла во временную переменную.
                    string temp = fs.ReadLine();

                    // Если достигнут конец файла, прерываем считывание.
                    if (temp == null) break;
  
                    // Пишем считанную строку в итоговую переменную.
                    if (textBox5.Text == temp) {

                    }
                }
            }
        }

        public void GetInfo(Book b)
        {
            textBox7.Text = "";
            for (int i = 0; i < b.Author_name.Length; i++)
            {
                textBox7.Text += b.Author_name[i].ToString() + "\r\n";
            }
            textBox8.Text = b.Book_name.ToString();
            textBox9.Text = b.Publishing_house.ToString();
            textBox10.Text = b.Year.ToString();
            dateTimePicker3.Value = b.Date_of_issue;
            dateTimePicker4.Value = b.Repayment_period;
        }
    }

    public class Book
    {
        public string[] Author_name { get; set; }
        public string Book_name { get; set; }
        public string Publishing_house { get; set; }
        public int Year { get; set; }
        public DateTime Date_of_issue { get; set; }
        public DateTime Repayment_period { get; set; }

        public Book(){}

        public Book(string n)
        {
            Book_name = n;
        }

        public Book(string n, int y)
        {
            Book_name = n;
            Year = y;
        }

        public Book(string[] a, string n, string p, int y, DateTime d, DateTime r)
        {
            Author_name = a;
            Book_name = n;
            Publishing_house = p;
            Year = y;
            Date_of_issue = d;
            Repayment_period = r;
        }
    }
}


Форма программы:
5e84ce2e2a1ce440874057.png

Файл, куда сохраняются данные:
5e84ce64ab615279487312.png

Заранее спасибо)
  • Вопрос задан
  • 265 просмотров
Пригласить эксперта
Ответы на вопрос 2
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Смотрите я вчера искал информацию по поиску сейчас не помню точно, но похоже ваш случай.

1. Необходимо включить индексацию на диске где вы храните файлы.
2. При создании каждого файла, вы задаете ему Meta attribute, в соответствии с вашими полями в классе.
3. Для поиска используете стандартный интерфейс Windows Search API
4. Результат поиска сохраняете в ObjectDataSource
5. На форме размещаете DataGrid и биндите его к ObjectDataSource
6. По кнопке "Вывести данные" составляете запрос, выполняете, заполняете ObjectDataSource

Ссылка на минимальный пример вот тут
https://stackoverflow.com/questions/34338465/how-t...
Ответ написан
Griboks
@Griboks Куратор тега C#
Советую изучить https://docs.microsoft.com/ru-ru/dotnet/csharp/pro...

Используйте встроенную сериализацию.
1. Для этого измените свойства на поля, добавьте атрибут
[Serializable()]
public class Book
    {
        public string[] Author_name;
        ...
    }

2. Создайте конвертер класса в данные.
var formatter = new SoapFormatter();
3. Сохраниет экземпляр класса в файл.
using (var fileStream = File.Create(fileName))  formatter.Serialize(fileStream, book1);


Ну и аналогично загружаете файл в память и читаете его.
Если нужно много классов сохранить, то можно использовать много файлов или, например, сериализовать сразу всю базу данных:
public class Library {
public Book Books[];
}


p.s.
Ещё существует замечательный методы File.WriteLines, File.WriteAllText,File.ReadLines, File.ReadAllText.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы