在将数据从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 ...答案 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;
}