C# (dotnetcore)で標準入力 (c#でもUNIX文化のパイプを利用したい)
The Art of UNIX Programming (アスキードワンゴ)にある、 Unixのインターフェイス設計のパターンのフィルタバターン(P.299)をC#でもやりたい。
c#のレッスンで、やり残した課題です。
標準入力を使おうとするとプログラムが止まってしまって困る。
どうやって解決するか。
IsInputRedirectedを使うことで解決できます。
利用するプロパティ
- System.Console.IsInputRedirected
- System.Console.In.ReadLine
ソート用プログラム
using System; using System.Collections.Generic; namespace stdin_example { class Program { //コンソールプログラムのエントリポイント static void Main(string[] args) { //入力が標準入力ストリームからリダイレクトされているかどうか判定 if (Console.IsInputRedirected) { //ソート用のList var list = new List<String>(); //標準入力を無限ループで読み込む while (true) { //標準入力から1行読み込む var readLine = System.Console.In.ReadLine(); //次の行がない場合は nullのため、無限ループから抜ける if (readLine == null) break; //1行毎にソート用のListに追加 list.Add(readLine); } //ソート処理実施 list.Sort(); //ソート結果を1行ずつ処理 foreach (string writeLine in list) { //ソート結果を標準出力で出力 Console.Write(writeLine + "\n"); } } } } }
使ってみる
ls の結果を流し込んでみる。
MacBookPro:netcoreapp3.1 mitsugi$ ls | dotnet stdin_example.dll stdin_example.deps.json stdin_example.dll stdin_example.pdb stdin_example.runtimeconfig.dev.json stdin_example.runtimeconfig.json
参考書籍
The Art of UNIX Programming (アスキードワンゴ)
- 作者:Eric S.Raymond,長尾 高弘
- 発売日: 2019/03/26
- メディア: Kindle版