如何在C#中的标准输入行上获取可枚举项?
我正在学习C#中的Linq,并构建了一个小词频脚本:如何在C#中的标准输入行上获取可枚举项?,c#,linq,C#,Linq,我正在学习C#中的Linq,并构建了一个小词频脚本: using System; using System.Text.RegularExpressions; using System.IO; using System.Linq; class WordCounter { public static void Main(string[] args) { Regex wordRegex = new Regex(@"[\p{L}']+"); File.R
using System;
using System.Text.RegularExpressions;
using System.IO;
using System.Linq;
class WordCounter
{
public static void Main(string[] args)
{
Regex wordRegex = new Regex(@"[\p{L}']+");
File.ReadLines("../test/wordcount_input")
.SelectMany(line => wordRegex.Matches(line).Cast<Match>())
.Select(x => x.Value.ToLower())
.GroupBy(x => x)
.OrderBy(x => x.Key)
.ToList()
.ForEach(p => Console.WriteLine("{0} {1}", p.Key, p.Count()));
}
}
但该方法在控制台中不存在。如何使用标准输入代替硬编码文件名
(注意:我之前在没有Linq的情况下编写了这个脚本,所以问题不在于Linq是否适合这个问题。我只是尝试学习Linq,并认为这将是一个很好的实验。)您可以编写如下方法:
private static IEnumerable<string> GetConsoleInputLines()
{
while (Console.In.Peek() >= 0)
yield return Console.ReadLine();
}
私有静态IEnumerable GetConsoleInputLines()
{
while(Console.In.Peek()>=0)
屈服返回控制台。ReadLine();
}
Console.ReadLine()
的问题是它会阻塞,直到提供完整的行。当没有更多的行时,上面的实现将停止迭代
如果省略while
条件,只要用户输入新行,就可以迭代此IEnumerable
,但此枚举器上的任何foreach
都将永远阻塞。您可以编写如下方法:
private static IEnumerable<string> GetConsoleInputLines()
{
while (Console.In.Peek() >= 0)
yield return Console.ReadLine();
}
私有静态IEnumerable GetConsoleInputLines()
{
while(Console.In.Peek()>=0)
屈服返回控制台。ReadLine();
}
Console.ReadLine()
的问题是它会阻塞,直到提供完整的行。当没有更多的行时,上面的实现将停止迭代
如果省略while
条件,只要用户输入新行,就可以迭代此IEnumerable
,但此枚举器上的任何foreach
都将永远阻塞。在处理之前应获得多少行?不确定您是否可以直接使用console执行此类操作。您可以使用反应式扩展来模拟它,或者在此基础上构建您自己的枚举和循环;StreamReader=新的StreamReader(流);reader.ReadToEnd().Split(新字符{'\n','\r'},StringSplitOptions.RemoveEmptyEntries()).SelectMany(…在处理之前应该获得多少行?不确定您是否可以直接使用console来完成这类操作。您可以使用反应式扩展来模拟它,或者在此基础上构建您自己的枚举和循环。尝试以下操作,尽管在方法完成之前必须关闭standardinput有一个问题:Stream stream=Console.OpenStandardInput();StreamReader reader=newstreamreader(stream);reader.ReadToEnd().Split(新字符{'\n','\r'},StringSplitOptions.removeMptyEntries())。SelectMany(……我确实计划使用命令行重定向(或命令行管道)在这种情况下,阻塞不是一个问题。如果在控制台上运行而不重定向,它会“永远”阻塞,这是非常好的。非常有趣的是,在C中,标准输入似乎被不同地对待。在Python中,我可以使用sys.stdin
甚至在Java中使用new BufferedReader(new InputStreamReader(System.in)).lines()
给了我一个流!我不敢相信Java能让C需要额外工作的东西变得简单。那么,你知道有没有类似于Console.In.Lines()
?@RayToal的东西吗?不,我不知道。Console.In
是一个,它只提供了一个ReadLine()
方法。我确实计划使用命令行重定向(或命令行管道)在这种情况下,阻塞不是一个问题。如果在控制台上运行而不重定向,它会“永远”阻塞,这是非常好的。非常有趣的是,在C#中,标准输入似乎得到了不同的处理。在Python中,我可以使用sys.stdin
甚至在Java中使用new BufferedReader(new InputStreamReader(System.in)).lines()
给了我这个流!我不敢相信Java能让C需要额外工作的东西变得简单。那么,你知道有没有类似于Console.in.lines()的东西吗?@RayToal不,我不知道。Console.in
是一个,它只提供了ReadLine()
方法。