LINQで簡易コマンドラインオプション解析

  • 11
    いいね
  • 2
    コメント
この記事は最終更新日から1年以上が経過しています。

C#でコマンドラインオプション解析したい

C#でコマンドラインの簡単なコマンドラインオプションの例ないかな。と思って以下の記事を見つけました。6年くらい前の記事です
Linqでコマンドラインオプション解析

これ以外の記事は複雑すぎて簡単に適当にいい加減に解析するには少し大きすぎるかな?という様子です。
やはり、C#ってそういう用途に選ばれにくい?

上の記事なんですけれど、使っていてみて少し使いにくいなーという部分がありました。

  • 渡されていないオプションは辞書に入ってこない

つまり、辞書に値が入っているかのチェックしてから取り出さないと例外出す

ということは入ってるときと入ってない時があるオプションは、こうかかなきゃいけないわけですよ


T val;
if(dictionary.TryGet("キー",out val))
{
  //val
}

これ簡易に何かしたい時には長過ぎるなーと思うわけです。だからオプションが入ってない時はnullとか入っててほしい。
これだけなんですけど結構イライラー

  • 地味にキーに-が入ってる

これはString.Substringで1文字削ればいい

結果こんなかんじになりました。

        static void Main(string[] args)
        {   
            //こんな感じで引数来るよね
            args = "-i 18 -hoge -huga haga -o in.txt".Split(' ');

            args = args.Concat(new string[] {""}).ToArray(); // オプションのみと そもそも入っていないの識別
            var options = new string[] {"-i", "-hoge", "-huga", "-o"};

            var result = options.ToDictionary(p => p.Substring(1), p => args.SkipWhile(a => a != p).Skip(1).FirstOrDefault());

            //パラメータなし引数は値がnullでないかでチェック
            if(result["hoge"] != null) Console.WriteLine("hogeがあります");

            foreach (var param in result)
            {
                Console.WriteLine(param.Key + "=" + param.Value);
            }

        }

実行結果

hogeがあります
i=18
hoge=-huga
huga=haga
o=in.txt