0

db1からdb2にデータをコピーした後、データの整合性のテストをたくさん行っています。

私はほとんど同じテストを書き続けています、これが擬似コードです

Get db1List
Get db2list

for each db2poco in db2list
 linq to get list of db1pocos.membervaribale1 matches db2poco.membervaribale1
  if db1pocos.membervaribale2 == db2poco.membervaribale2
     return false

return true

比較のためにジェネリックとラムダを使用するジェネリックメソッドに変換したいと思います...コンパイルされないことを除いて、このようなものです...

private bool GenericCompareLists<T1, T2>(List<T1> cdssList, List<T2> spamisList, object sender, Func<bool, T1, T2> filterLambda ,  Func<bool, T1, T2> compareLambda )
{
    bool passed = true;
    foreach ( T2 spamisCv in spamisList )
    {
        List<T1> cdssSubList = ( from l in cdssList where filterLambda( l, spamisCv ) select l ).ToList();// should alwasy be one, 
        if ( cdssSubList.Count != 1 )
        {
            log.Error( "..." );
            passed = false;
        }
        else
        {
            T1 cdssCv = cdssSubList.First();

            if ( compareLambda( cdssCv, spamisCv) )// comparing the sum of all check_amt for this type, cdss vs spamis - EWB
            {
                log.Error( "Failed in comparison f" + sender.ToString()  );
                passed = false;
            }
        }
    }
    return passed;
}

しかし、私はそれを実際に機能させる方法/それを呼び出す方法をoutsytnaxに理解することはできません。

誰かが私に手を貸してくれませんか?または、ラムダfuを上げる良い参照を教えてください...

4

3 に答える 3

4

間違いなく

Func<bool, T1, T2> 

する必要があります

Func<T1, T2, bool>

これは、Funcの定義が次のとおりであるためです。

public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);

3番目のジェネリック引数は、メソッドprototype/delegateの戻り値を定義する引数であることに注意してください。

それを試して、それがどうなるかを見てください。それだけかどうかはわかりません(周囲のクラスで適切に定義されたフィールドをログに記録しますか?)

于 2013-02-21T23:10:36.250 に答える
1

Funcデリゲートの戻り値は、最初ではなく、最後のジェネリックパラメーターです。(イン/アウト分散マーカーでわかります)。したがって、boolを最後のジェネリックパラメータに移動すると、コンパイルされます。

つまり、署名を次のように変更します(funcタイプのタイプパラメーターの位置に注意してください)。

    private bool GenericCompareLists<T1, T2>(List<T1> cdssList, List<T2> spamisList, object sender, Func<T1, T2, bool> filterLambda, Func<T1, T2, bool> compareLambda)

それは私のためにそれをコンパイルさせます。欠落している'log'変数を割り引く。

于 2013-02-21T23:11:54.670 に答える
1

Funcパラメータの順序が間違っているため、独自のフィルタ関数を使用する場合はクエリ構文を使用できません。あなたが望むように見えます:

private bool GenericCompareLists<T1, T2>(List<T1> cdssList, List<T2> spamisList, object sender, Func<T1, T2, bool> filterLambda ,  Func<T1, T2, bool> compareLambda )
{
    bool passed = true;
    foreach ( T2 spamisCv in spamisList )
    {
        List<T1> cdssSubList = cdssList.Where(l => filterLambda(l, spamisCv)).ToList();
        if ( cdssSubList.Count != 1 )
        {
            log.Error( "..." );
            passed = false;
        }
        else
        {
            T1 cdssCv = cdssSubList.First();

            if ( compareLambda( cdssCv, spamisCv) )// comparing the sum of all check_amt for this type, cdss vs spamis - EWB
            {
                log.Error( "Failed in comparison f" + sender.ToString()  );
                passed = false;
            }
        }
    }
    return passed;
}
于 2013-02-21T23:13:07.013 に答える