#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;
}
}