コマンドライン引数を解析するプログラムまたはアルゴリズムを作成しました。まず、有効な引数とその属性 (フラグ、セパレーターなど) を指定する必要があります。
今、私は返すヘルパー関数を持っています: :ペアが見つからなかった場合Tuple<Tuple<Argument, String>, String>
、タプル (これもタプルです) の最初の要素には「キーと値のペア」が含まれます。null
2 番目の要素には、オプションとして識別された文字列が含まれており、セパレータは" "
(値がコマンド ラインの次の要素になることを意味します)
その関数のコードは次のとおりです。
private Tuple<Tuple<Argument, String>, Argument> f(string e, List<Argument> valid) {
var p = valid.Find( x => { return e.StartsWith( x.value ); } );
if ( p == null )
return new Tuple<Tuple<Argument, String>, Argument>( null, null );
if ( p.flag )
return new Tuple<Tuple<Argument, String>, Argument>( new Tuple<Argument, String>( p, "" ), null );
if ( p.separator.Equals(" ") && p.value.Length == e.Length )
return new Tuple<Tuple<Argument, String>, Argument>( null, p );
var si = e.IndexOf(p.separator);
if ( si != p.value.Length )
return new Tuple<Tuple<Argument, String>, Argument>( null, null );
return new Tuple<Tuple<Argument, String>, Argument>( new Tuple<Argument, String>( p, e.Substring( si + p.separator.Length ) ), null );
}
これを短く書く方法はありますか?そこにジェネリックを明示的に配置する必要がありますか?
明らかに、そのための独自のクラスを作成することが解決策になります。でも他にないの?
参考までに、Scala の同じコードは次のようになります。
val po = valid.find(p => e.startsWith(p.value))
po match {
case Some(p) =>
if ( p.flag )
(Some((p, "")), None)
else if ( p.separator.matches(" |\t") && p.value.length == e.length )
(None, Some(p))
else {
val si = e.indexOf(p.separator)
if ( si != p.value.length )
(None, None)
else
(Some((p, e.substring(si + p.separator.length))), None)
}
case _ => (None, None)
}
さらに、コンパクトな方法で開始する方法はありますLists
か? Tuples
のように、List(1, 2, 3, 4)
または(Key, Value)
代わりにTuple<KeyType, ValueType>(Key, Value)
よろしく、
ダニエル。