私はC#でLINQのを学び、少し単語頻度スクリプトを構築しています:C#の標準入力行で列挙型を取得する方法は?
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()
しかし、その方法はConsole.In
に存在しません。ハードコードされたファイル名の代わりに標準入力を使用するにはどうすればよいですか?
(注:。。私は以前のLINQせずにこのスクリプトを書かれているので、質問はLINQのは、私は単純にLINQを学ぶためにしようとしている。この問題のために適切であり、これは良い実験を行うだろうと思ったかどうかではありません)
あなたはこのような方法で書くことができる
処理する前にいくつの行を取得する必要がありますか? –
コンソールで直接このようなことができるかどうかはわかりません。あなたはReactive Extensionsでそれをシミュレートしたり、独自の列挙型とループを構築することができます。 – DavidG
次のようにしてみてください。ただし、メソッドが完了する前にstandardinputを閉じる必要があります。Stream stream = Console.OpenStandardInput(); StreamReader reader =新しいStreamReader(ストリーム); SelectMany(.... – jdweng