用c#从文本文件中获取单词

本文关键字:获取 单词 文件 文本 | 更新日期: 2023-09-27 17:49:37

我写了一个方法,从随机文本文件中获得以"b"开头的单词,并返回一个IEnumerable。它必须有一个收益回报。

问题是我不知道如何将Ienumerable和yield return结合起来编写这样的方法。

这是我到目前为止得到的:GetWords.cs:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    namespace week3
         {
             class GetWords : IEnumerable<String>
    {
        private String[] getWords;
        public GetWords()
        {
        }
        public IEnumerator<String> GetEnumerator()
        {
            try
            {
                String path = @"C:'Users'Lilly'Downloads'randomtext.txt";
                foreach (String word in getWords (path, s => s.StartsWith("b")))
                 Console.Write("{0}; ", word);

            }
            catch (Exception ex)
            {
                Console.WriteLine("wrong path");
            }
            yield return word;
        }
        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
    }
}

用c#从文本文件中获取单词

此方法yield返回所有以'b'开头的单词

public static IEnumerable<string> ReadWords(this FileInfo fileInfo, Encoding enc)
{
    using (var stream = new FileStream(fileInfo.FullName, FileMode.Open, FileAccess.Read, FileShare.None))
    {
        using (var reader = new StreamReader(stream))
        {
            do
            {
                string[] line = reader.ReadLine().Split(' ');
                foreach (string word in line)
                {
                    if (word.StartsWith('b'))
                    yield return word;
                }
            } while (!reader.EndOfStream);
        }
    }
}
使用

string path = @"C:'Users'Lilly'Downloads'randomtext.txt";
var result = ReadWords(path, Encoding.Default);

这一行将执行任务并在内部使用yield return:

var allWordsStartingWithB = File.ReadLines(filePath).SelectMany(line => line.Split(' ')).Where(word => word.StartsWith("b"));

当然你可以更明确地使用yield return如果你想这样做,尽管这有点没用:

public static IEnumerable<string> ReadWordsStartingWithB(string filePath)
{
    var allWordsStartingWithB = File.ReadLines(filePath).SelectMany(line => line.Split(' ')).Where(word => word.StartsWith("b"));
    foreach(var wordWithB in allWordsStartingWithB)
        yield return wordWithB;
}
ReadAllText方法不同,ReadLines也返回一个IEnumerable。优点:除非需要,否则该方法不会读取整个文件。所以,如果你只想要前5个以a b开头的单词,你可以这样做,只读取文件中需要的行,而不是整个文件:
var first5Words = ReadWordsStartingWithB("'folder'subfolder'textFile.txt").Take(5).ToArray();

使用system.io.file.readalltext获取所有文本。把它分成"得到单词。然后查找所有以b开头的内容:

var wordsThatStartWithB = System.IO.File.ReadAllText("D:''test.txt")
        .Split(char.Parse(" "))
        .Where(x => x.StartsWith("b"));