将lambda传递给方法来比较两个列表的成员

时间:2013-02-21 22:59:44

标签: c# .net lambda

在将数据从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 ...

3 个答案:

答案 0 :(得分:4)

肯定是

Func<bool, T1, T2> 

应该是

Func<T1, T2, bool>

那是因为Func的定义是:

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

注意第三个泛型参数是定义方法prototype / delegate的返回值的参数。

试一试,看看它是怎么回事。 我不确定是唯一一个(在周围的类中记录一个正确定义的字段吗?)

答案 1 :(得分: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'变量。

答案 2 :(得分: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;
}