3

私は次のメソッド定義を持っています(冗長なジェネリックを削除するために編集されました):

public static T SearchAgaistValues<T>(Dictionary<string, string> input, 
string key, List<T> values, Predicate<T> match, out string[] cmdParams)

私の簡略化された要件は次のとおりです。を検索する必要がありますinputkey見つかった場合は、その値がに表示されるかどうかを確認しますvalues。ただし、values一般的です(そして、明らかに一致する必要のある文字列が含まれます)。したがって、私の見方では、マッチングを実行するために述語メソッドを渡す必要があります。

ただし、Predicate<T>私が見たすべての例には、ハードコードされたコンパレータがあります。key's見つかった値をの各項目と比較する必要がありますvalues。ただし、これらの値を渡すことはできません。

デリゲートベースのmatchメソッドを使用してforeachループの外でこれを行う方法がわかりません。

ここで何かが足りませんか?

4

1 に答える 1

5

私が見ているように、クレイジーな要件を変更することなく、2 つのオプションがあります。

オプション 1 は、Func<string, T1, bool>の代わりに使用することですPredicate<T1>。このようにして、述語は必要に応じて文字列と T1 の間で変換し、一致したブール値の結果を返すことができます。

public static T1 SearchAgaistValues<T, T1>(
            Dictionary<string, string> input, 
            string key, 
            List<T1> values, 
            Func<string, T1, bool> match, 
            out string[] cmdParams)

または、追加のパラメーターを渡しConverter<T1, string>て検索文字列を T1 に変換し、述語を使用して比較することもできます。

public static T1 SearchAgaistValues<T, T1>(
            Dictionary<string, string> input, 
            string key, 
            List<T1> values, 
            Converter<T1, string> converter,
            Predicate<T1> match, 
            out string[] cmdParams)

ただし、どちらの場合も理想的ではありません。この関数は、その逆というよりも、解決策を探す問題のように聞こえます。署名は少しおかしくて、要件を言い換えたり、細かく分割したりすることで大幅に簡素化できるようです。

于 2011-07-12T01:01:22.427 に答える