2017-10-24 19 views
0

私はまだかなり新しい(C#)コーディングであり、ユーザー基準(検索する文字列)に基づいてファイルリーダーを作成しています。私のプログラムは何ユーザー入力による動的IF関数の作成

ユーザーが刺さ/複数の文字列(とAND OR機能)を検索入力することができます プログラムは、ユーザの入力を解釈し、コードに文字列を再書き込みます。例えば

string fileLine = File.ReadAllText(line); 

USER:

(hi AND no) OR yes 

PROGRAM:私は何をしようとしている

if((fileLine.Contains(hi) && fileLine.Contains(no)) || fileLine.Contains(yes)) 

私はIF関数を使用してファイルの文字列に文字列と一致します:

if(fileLine.Contains(hi)) 
{ 
    //do A LOT of stuff here. 
} 

私の最初のアイデアは、入力された文字列から文字列を作り、IF関数の "条件"を置き換えることでした。

私は間違ったやり方でこのことを行っていますか?これを達成する最良の方法は何でしょうか?

+3

通常、私はそのようなものを設定したいときは、私自身の文法を発明するのではなく、正規表現を使用します。これで、ユーザーは '(はい)|(こんにちは*いいえ)|(いいえ* hi)'のようなことをすることができます。読みやすいとは言えませんが、実装がはるかに簡単です。 – juharr

+1

あなたは[この質問]([https://stackoverflow.com/questions/1928881/parsing-a-custom-search-criteria-grammar-in-c-sharp])を投稿した人物に似た何かをしようとしているようです?rq = 1)。 – itsme86

答えて

0

入力をパラメータ化することをお勧めします。あなたは本当に2つのことをしようとしているように見えます。まず、ユーザーの入力が何であるかを判断し、その入力に対処したいとします。

まず、ユーザーが入力した行を読み取ります。あなたの典型的な期待される入力が(bob AND casey) OR joshのようなものなら、バックエンドで正規表現ベースの文法を実装するのはかなりシンプルでなければなりませんが、juharrが言うように、それはもっと複雑です。しかし、ユーザーの入力がAND/ORであると仮定し、括弧でグループ化され、あなたはこのようにそれを打破する可能性の高いお勧めします: - それぞれの括弧 - フィルタリングの各ユニットについて

  1. あなたは次の2つの情報を保持します: (bob,casey)と演算子(AND)のフィルタリング対象項目
  2. これらの単位は大文字と小文字が区別されます。 (bob AND casey) OR joshのフィルタリングはbob AND (casey OR josh)とは異なります。したがって、検索するオーダーの上位レベルの表現も必要です。(bob AND casey) OR joshについては、{result of bob AND casey} OR {result of josh}に基づいて検索の有効性を判断します。

これはおそらくオブジェクトです。 :)

ユーザーが標準化された形式で入力した場合、正当性をチェックし、解析できないものがあるかどうかをユーザーに知らせます(閉じられていないカッコなど)。

ユーザーに通知した後で、実際のファイル検索を実行する必要があります。私は、各検索単位(上記の項目2)を独自の「検索」として扱い、検索演算子にはswitch statementを使用することをお勧めします。

switch (operator) { 
     case operator.AND: 
      inString = fileLine.Contains(itemOne) && fileLine.Contains(itemTwo) 
     case operator.OR: 
      inString = fileLine.Contains(itemOne) || fileLine.Contains(itemTwo) 
    } 

また、あなたがbool AND string.Containsbool OR string.Containsを比較しているケースを処理することになるでしょう。

もしあなたがbob AND josh OR caseyのようなものを持っていれば、それらを一度に切り詰めて一度に1つずつ比較しながら1レベルの線形比較を行うことができます。(bob and joshはboolを返します。 bool OR string.Contains操作)

この構造は、スコープが変更された場合(つまり、増加する一連のif文を持たない場合)、スパゲッティコードを取得しにくくなり、予測できない入力を処理し、ユーザーに何か問題がある場合

関連する問題