在将数据从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;
}但我不知道如何让它真正工作/调用它。
有谁能帮我一下吗?或者给我推荐一些好的推荐人来提升我的拉姆达夫...
发布于 2013-02-22 07:13:07
您的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-22 07:10:36
肯定的是
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方法的返回值。
试一试,看看效果如何。我不确定这是唯一的一个( log是周围类中正确定义的字段吗?)
发布于 2013-02-22 07:11:55
Func委托返回值是最后一个泛型参数,而不是第一个。(您可以通过输入/输出方差标记来判断)。因此,如果您将bool移到最后一个泛型参数,它应该会被编译。
ie将符号更改为(请注意类型参数在函数类型中的位置):
private bool GenericCompareLists<T1, T2>(List<T1> cdssList, List<T2> spamisList, object sender, Func<T1, T2, bool> filterLambda, Func<T1, T2, bool> compareLambda)这使得它可以为我编译。正在对缺少的“log”变量进行折扣。
https://stackoverflow.com/questions/15013875
复制相似问题