developer's diary

最近はc#のエントリが多いです

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

参考書籍