首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将lambda传入方法以比较两个列表的成员

将lambda传入方法以比较两个列表的成员
EN

Stack Overflow用户
提问于 2013-02-22 06:59:44
回答 3查看 144关注 0票数 0

在将数据从db1复制到db2之后,我做了很多数据完整性测试。

我一直在写几乎相同的测试,下面是伪代码

代码语言:javascript
复制
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进行比较……类似这样的东西,除了它不能编译...

代码语言:javascript
复制
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;
}

但我不知道如何让它真正工作/调用它。

有谁能帮我一下吗?或者给我推荐一些好的推荐人来提升我的拉姆达夫...

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-22 07:13:07

您的Func参数的顺序错误,并且在使用您自己的过滤器函数时不能使用查询语法。看起来你想要:

代码语言:javascript
复制
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;
}
票数 1
EN

Stack Overflow用户

发布于 2013-02-22 07:10:36

肯定的是

代码语言:javascript
复制
Func<bool, T1, T2> 

应该是

代码语言:javascript
复制
Func<T1, T2, bool>

这是因为Func的定义是:

代码语言:javascript
复制
public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);

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

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

票数 4
EN

Stack Overflow用户

发布于 2013-02-22 07:11:55

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

ie将符号更改为(请注意类型参数在函数类型中的位置):

代码语言:javascript
复制
    private bool GenericCompareLists<T1, T2>(List<T1> cdssList, List<T2> spamisList, object sender, Func<T1, T2, bool> filterLambda, Func<T1, T2, bool> compareLambda)

这使得它可以为我编译。正在对缺少的“log”变量进行折扣。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15013875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档