如何在C#中的标准输入行上获取可枚举项?

如何在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

我正在学习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.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()
方法。