Delphi の Case ステートメントで文字列を判別変数として使用するChen Jiaxin╱[email protected]●序文で Case ステートメントについて言及したとき、最初に思い浮かぶアプリケーション ケースは、プログラム フローが選択できるように変数を決定することです。さまざまな条件に応じて実行を継続するための適切なパス。または、プログラム内に一連の if ステートメントと else if ステートメントの組み合わせがある場合、Case ステートメントを使用してプログラム コードを簡素化し、可読性と実行効率を向上させることを考えることがよくあります。ただし、場合によっては、Case ステートメントをプログラムに適用できない場合があります。これは、許可される判別変数が xPRession の形式に制限されているためです。これは、いわゆる「順序型」であり、次のような「順序付き」型を指します。整数、文字、列挙、ブール値、セット。Ord()、Pred()、Succ()、Low()、High() などに適用できます。 式のタイプ ([1] を参照)。残念ながら、文字列(string)は明らかに序数型ではなく、ある時点(以下に例を示します)で、条件変数の型が文字列で条件分岐がかなり多い場合、どうしようもないのですが、しかし、悲しいことに、if ステートメントと else if ステートメントを大量に使用する以外に方法はないようです。たとえば、次のコードは Delphi では許可されません: #001 var #002 Str: String; // String 型の判別変数を宣言します #003 begin #004 case Str of // エラー メッセージ: Ordinal type が必要です #005 / / ... #006 end; #007 end;これは単純にコンパイルできないため、従来の解決策は通常、これを多数の if ステートメントと else if ステートメントの組み合わせに変換することです。この時点では、Visual Basic を使用していればよかったと心から思います。次のコードがそのコンパイラで許可されているからです ([5] を参照): #001 Dim Str As String ' String 型の判別変数を宣言します #002 Select Case Str ' は同等ですDelphi の Case ステートメント #003 '... #004 End Select ' OK、コンパイルを通じて そこで、この記事では、著者は、if と else の組み合わせに変換することに加えて、この問題を出発点として使用しようとします。 if ステートメントは「従来の解決策以外に他の実現可能な解決策を探している」ものであり、この問題に直面し、解決策を見つけたいと考えている人々にとってこの記事が役立つことを心から願っています ([12] ~ [14] を読んだ後、著者はさらにこれが実際に当てはまることがわかりました)最初に 7 つのソリューションを紹介する予定です。最初の 5 つのメソッドは [9] ~ [13] からの抜粋または拡張であり、6 番目のメソッドは著者が実装した包括的なマルチローダーです。バージョン。これらのオプションは次のとおりです。 v オプション 1: 文字列配列の検索 v オプション 2: 実数索引の使用 v オプション 3: ハッシュ関数の使用 v オプション 4: ネストされた case ステートメント v オプション 5: TStringListv の使用 オプション 6: マルチロード関数の実装 解決策 7: 適用この記事は、条件文 (主な内容は [1] と [4] を参照) や認識文字列 (主な内容は [2] を参照) などのトピックから始めます。Delphi に精通している人は読み飛ばしてください。このセクションの「パフォーマンスの問題」セクションを記事の最後まで読んでください。