使用C#从文本文件中获取单词

时间:2015-05-19 08:10:11

标签: c# text-files ienumerable yield-return

我编写了一个方法,从randomtext文件中获取以“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();
        }
    }
}

4 个答案:

答案 0 :(得分:2)

此方法yield会返回以&#39; b&#39;

开头的所有单词
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);

答案 1 :(得分:1)

这一行将执行任务并在内部使用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。优点:除非需要,否则该方法不会读取整个文件。因此,如果您只想要以 b 开头的前5个单词,您可以这样做,只会读取文件所需的行而不是整个行:

var first5Words = ReadWordsStartingWithB("\folder\subfolder\textFile.txt").Take(5).ToArray();

答案 2 :(得分:0)

这是我的实施:

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

namespace StackOverflowHomeworkHelpHotline
{
    class GetWords : IEnumerable<String>
    {
        public GetWords()
        {

        }

        public IEnumerator<String> GetEnumerator()
        {
            String path = @"randomtext.txt";

            foreach (String word in File.ReadAllText(path).Split(' ').Where(s => s.StartsWith("b")))
                yield return word;
        }

        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
    }
}

答案 3 :(得分:0)

使用system.io.file.readalltext获取所有文本。 用“”拆分它来得到单词。 然后只需查找以b开头的任何内容:

class="teams"