【问题标题】:C# yield returnC# 产量回报
【发布时间】:2017-05-08 21:08:59
【问题描述】:

我在下面有这个方法 GetWordsArray,当我在主程序中调用该方法时,它只打印出以特定字母开头的整个句子。

    public static void GetWordsArray(string path, string toFind)
    {
        string[] words = File.ReadAllLines(path);
        if (File.Exists(path)) 
        {              
            foreach (string line in words)
            {
                if(line.StartsWith(toFind))
                {
                    Console.WriteLine(line);
                }                  
            }
        }
        else
        {
            Console.WriteLine("Directory not found");
        }
    }

这是我在主程序中调用方法的方式:

    Reader r = new Reader();            
    string path = @"randomtext.txt";
    Reader.GetWordsArray(path, "b");

例如,如何打印出文本文件中所有以字母 b 开头的单词?

【问题讨论】:

  • 1.显示你在哪里输出到控制台,2.为什么你可以循环并返回当你可以返回lines
  • 为什么要重新实现File.ReadLines?另外请确保提供minimal reproducible example,以显示您如何输出结果。
  • 我需要退还它,因为它是一项学校作业,必须使用它-.- 不知道如何。
  • 问一些与你的问题无关的问题是没有效率的。请确保edit 发布有明确问题以及您不了解的内容。帖子中的代码和您的 cmets 根本不对齐(因为代码看起来不错,并表明代码的 OP 知道如何使用 yield
  • 我问了一个新问题,感谢提示,希望这个问题更清楚。

标签: c# file foreach


【解决方案1】:
public class Program
{
    public static void Main(string[] args)
    {
        foreach (string item in GetWords(@"C:\Temp\file.txt"))
        {
            Console.WriteLine("{0} ", item);
        }
    }

    public static IEnumerable<String> GetWords(string path) 
    {
        if (File.Exists(path))
        {
            foreach (var line in File.ReadAllLines(path))
            {
                yield return line;
            }
        }
        else
        {
            Console.WriteLine("Directory not correct");
            yield return null;
        }
    }
}

【讨论】:

  • return File.ReadAllLines(path).AsEnumerable();????数组已经是IEnumerable - 读取整个文件然后假装它是惰性可枚举是非常奇怪的建议。
  • @AlexeiLevenkov,是的,对不起,好点,没有 VS 方便,所以把一些东西放在一起。
  • 你能告诉我如何yield return吗?您提供的代码很好,但这是学校作业,必须符合要求。
  • @meesie1 详细说明您需要产量的原因。
  • 我首先是在 try catch 中完成的,它起作用了,但是在阅读了我需要添加 yield return 的作业后,我添加了它并且代码也建议了它,但是你不能在 try 中使用 yield return抓住,搜索了几个小时后,我最终采用了这种方法。
【解决方案2】:

假设您的方法在一个名为 Hello 的类上。那么你可以这样称呼它。

 Hello hello = new Hello();
 string path = @"D:\Data\words.txt";
 var lines = hello.GetWords(path);
 foreach (var line in lines)
 {
      Console.WriteLine(line);
 }

您的方法确实有一些冗余,因为您可以简单地返回 lines 变量,它会以相同的方式工作。编写迭代器时使用 yield。

【讨论】:

    猜你喜欢
    • 2015-06-24
    • 2019-05-14
    • 2012-01-06
    • 2019-04-04
    • 2013-06-28
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 2014-11-19
    相关资源
    最近更新 更多