如何在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,并认为这将是一个很好的实验。)
您可以编写这样的方法:
private static IEnumerable<string> GetConsoleInputLines()
{
while (Console.In.Peek() >= 0)
yield return Console.ReadLine();
}
Console.ReadLine()
的问题在于它阻塞直到提供了完整的线路。当没有更多的行时,上面的实现停止迭代。
如果省略while
条件,那么只要用户输入新行,就可以迭代该IEnumerable
,但该枚举器上的任何foreach
都将永远阻塞。