2016-11-10 19 views
2

Delphi 10/Seattleでは、ネストされたStringテストを実行しようとしています...私は製品名である文字列を持っています。その商品名に基づいて商品カテゴリを見つける必要があります。これは大文字と小文字を区別せず、各製品は1つのカテゴリにのみ含まれます。私がカテゴリを見つけたら、私はチェックを止めることができます...私の最初のアプローチは、CASE文の中でAnsiContainsTextを使ってこれを行うことですが、CASE文には共通の機能がないので、これは許されません...Delphi - CASE文の関数を使用

私はうまくいくはずのアプローチを持っていますが、もう少しエレガントなものがありますか?私はそのカテゴリについて約40種類のテストを行い、約6000種類の製品でこのテストを実行していますので、可能な限りパフォーマンスを上げたいと思います。

 // Determine new value... 
     Category := ''; 
     if ((Category = '') and (AnsiContainsText(ProductText, 'PaaS')) then Category := 'PaaS'; 
     if ((Category = '') and (AnsiContainsText(ProductText, 'IaaS')) then Category := 'IaaS'; 
     if ((Category = '') and (AnsiContainsText(ProductText, 'SaaS')) then Category := 'SaaS'; 
... 

答えて

10

アウトソースit!

function FindCategory(const ProductName: string): string; 
const 
    categories: TArray<string> = ['PaaS', 'IaaS', 'SaaS']; // can easily be extended 
var 
    S: string; 
begin 
    for S in categories do begin 
    if ContainsText(ProductName, S) then Exit(S) 
    end; 
    result := ''; 
end; 
-1

あなたは、POS()関数を使用することができます。

function FindCategory(const ProductName: string): string; 
const 
    categories: string = 'PaaS,IaaS,SaaS,'; 
begin 
    if Pos(ProductName+ ',', categories)>0 then Exit(ProductName); 
    result := ''; 
end; 
+1

機能は、一致が見つかった場合、カテゴリのアイテムを返すように期待しています。 –

+0

したがってStrutils.AnsiIndexStr()関数を使用する場合はこちらをご覧ください。 –

関連する問題