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

我想将它转换为一个通用方法,该方法采用泛型和 lambdas 进行比较......有点像这样,除了它不编译......

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;
}

但我无法弄清楚如何让它真正工作/调用它。

有人可以帮帮我吗?或指出我的 lambda 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);

请注意,第三个通用参数是定义方法原型/委托的返回值的参数。

试试看,看看效果如何。我不确定这是唯一的(在周围的类中记录一个正确定义的字段吗?)

于 2013-02-21T23:10:36.250 回答
1

Func 委托返回值是最后一个通用参数,而不是第一个。(您可以通过输入/输出差异标记来判断)。因此,如果您将 bool 移动到最后一个泛型参数,它应该可以编译。

即将签名更改为(注意函数类型中类型参数的位置):

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

这使它为我编译。折扣缺少的“日志”变量。

于 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 回答