如何在C#中的标准输入行上获得可枚举值

本文关键字:枚举 标准输入 | 更新日期: 2023-09-27 17:57:32

我正在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()));
    }
}

这是可行的,但我想用标准输入替换硬编码的文件名。不幸的是,我不知道该怎么做。我试过

Console.In.ReadLines()

但是该方法在CCD_ 1上不存在。如何使用标准输入代替硬编码文件名?

(注意:我之前在没有Linq的情况下编写了这个脚本,所以问题不在于Linq是否适合这个问题。我只是想学习Linq,并认为这将是一个很好的实验。)

如何在C#中的标准输入行上获得可枚举值

您可以编写这样的方法:

private static IEnumerable<string> GetConsoleInputLines()
{
    while (Console.In.Peek() >= 0)
        yield return Console.ReadLine();
}

Console.ReadLine()的问题在于它阻塞直到提供了完整的线路。当没有更多的行时,上面的实现停止迭代。

如果省略while条件,那么只要用户输入新行,就可以迭代该IEnumerable,但该枚举器上的任何foreach都将永远阻塞。