Сохранение текста в список, разделенный разделителями, с использованием объектов и методов

#c# #object

#c# #объект

Вопрос:

В настоящее время я пытаюсь прочитать большой фрагмент текста, сохраненный в файле string TestFile, показанном ниже. Затем я хочу просмотреть каждую строку и добавить каждое слово, разделенное разделителями, в список. Мне удалось успешно сделать это для массива (с очень разным кодом, конечно), однако я раньше не использовал списки, и я также пытаюсь включить классы и методы в свое кодирование. Я знаю, что приведенное ниже не будет работать, поскольку объект не возвращает никакого значения из метода (?), Однако я не знаю, как это должно быть сделано. Любая помощь или некоторые полезные ресурсы по спискам или объектам были бы очень признательны.

 using System;
using System.IO;
namespace Summarizer
{
    class Reader
    {
        public static void Main(string[] args)
        {
            string TestFile = @"C:UsersollieDesktopTestTargetPracticeHolmes.txt";
            ReadList TestRead = new ReadList(TestFile);
    }
}
  class ReadList
    {
        private string line;
        private char[] delimiters = { ' ', '.', ',', '!', '?' };

        public ReadList(string TestFile)
        {
            StreamReader tr = new StreamReader(TestFile);
            
            while ((line = tr.ReadLine()) != null)
            {
                line.Split(delimiters);
                TestRead.Add(line);
            }
        }
}
   
 

Комментарии:

1. Я не слишком уверен, в чем разница между обоими списками, не могли бы вы немного объяснить? Кроме того, File.ReadLines(etc), который вы написали, попадает в цикл While? Кроме того, как бы вы затем вернули список обратно в основную часть программы?

Ответ №1:

Вы можете прочитать свой TestFile текст в список слов с помощью одной строки кода с помощью выражения LINQ:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;

class ListReader
{
    private char[] delimiters = { ' ', '.', ',', '!', '?' };

    public List<string> Read(string fileName) =>
        File.ReadLines(fileName).SelectMany(l => l.Split(delimiters)).ToList();
}
 

И чтобы использовать ListReader класс, выполните:

 var list = new ListReader().Read(TestFile);
 

Примечания:

  • Массив T [] представляет список фиксированного размера. После выделения вы можете заменить элементы в массиве, но вы не можете расширять или сжимать массив.
  • A List<T> представляет список с возможностью изменения размера. Вы бы использовали список для представления последовательной коллекции объектов, к которым можно получить доступ по индексу и к которым вы, возможно, позже захотите добавить или удалить элементы.
  • File.ReadLines() перечисляет все строки в текстовом файле без загрузки всего файла в память. Таким образом, он выполняет то же самое, что и ваш while ((line = tr.ReadLine()) != null) цикл, за меньшее количество строк кода.
  • SelectMany() и ToList() являются методами расширения из System.Linq пространства имен и позволяют проецировать перечисление в перечисление перечислений, а затем сглаживать результат (здесь, проецируя каждую строку в массив слов, затем сглаживая ее в последовательность слов), а затем материализуя перечисление в список.
  • Если вам нужны только отдельные слова (т. Е. Список слов с удаленными дубликатами), вы можете использовать метод .Distinct() расширения следующим образом:
      public List<string> ReadDistinct(string fileName) =>
         File.ReadLines(fileName).SelectMany(l => l.Split(delimiters)).Distinct().ToList();
     

Ответ №2:

Существует более удобный способ чтения строк из текстового файла, File.ReadAllLines(TestFile) кроме того, не забудьте где-нибудь сохранить слова, т.Е. Сохранить возвращаемое значение из line.Split(delimiters)

Вот полный пример:

             string TestFile = @"C:UsersollieDesktopTestTargetPracticeHolmes.txt";
            var lines = File.ReadAllLines(TestFile);
            var words = new List<string>();
            char[] delimiters = { ' ', '.', ',', '!', '?' };
            foreach (var line in lines)
            {
                words.AddRange(line.Split(delimiters));
            }
 

Что касается части вопроса «использование объектов и методов», вы можете создать класс, который обрабатывает то, что вы хотите сделать. Давайте вызовем его Reader . Теперь, что вы хотите, чтобы читатель сделал для вас? Читатель должен иметь возможность принимать некоторые входные данные (файл или путь к файлу) и создавать некоторые выходные данные (проанализированные слова). Вы можете добавить метод, который делает именно это, давайте вызовем его Read . При этом ваш код может выглядеть примерно так:

     class Reader
    {
        string[] Read(string filePath)
        {
            // construct and return the words;
        }
    }