2013-02-21 30 views
0

将数据从db1复制到db2后,我正在做大量的数据完整性测试。将lambdas传入方法来比较两个列表的成员

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

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 

我想将其转换成需要的compareisons泛型和lambda表达式的通用方法...一些kindof像这,除了它不编译...

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

但我无法弄清楚如何使它acutally工作/调用它。

请问你能给我一个手吗?或指向我好refernces,将撞了我的拉姆达福...

+0

看起来正确,问题在哪里? – 2013-02-21 23:04:17

+1

“除非它不编译” - 可以添加错误消息吗? – poke 2013-02-21 23:05:19

+0

下面的答案得到了不令人满意,谢谢!我先是布尔而不是最后一个。现在我只需要弄清楚如何编写lambda表达式,并且我很快乐。 – 2013-02-21 23:32:02

回答

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

这看起来不错,并编译谢谢!当我想要filerLambda和compareLambda在成员变量上进行比较时,我该如何调用它。 I.E:cdss.cost == spamis.cost – 2013-02-21 23:26:14

+1

@ EricBrown-Cal - 在这种情况下,您的'compareLambda'参数应该是'(cdss,spamis)=> cdss.cost == spamis.cost'。 – Lee 2013-02-21 23:33:15

+0

太棒了!我很亲密,谢谢你摇滚! – 2013-02-21 23:34:53

4

十分肯定

Func<bool, T1, T2> 

应该

Func<T1, T2, bool> 

那是因为Func键的定义是:

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

注意到第三个泛型参数是定义方法pro的返回值的参数totype /代表。

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

+0

是的日志是在类中定义的,thansks! – 2013-02-21 23:28:10

1

Func委托返回值是最后一个通用参数,而不是第一个。 (你可以通过输入/输出方差标记来判断)。所以如果你把布尔移动到最后一个通用参数,它应该编译。

即改变signiture至(注意到类型参数的在FUNC类型的位置):

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

这使得编译为我。对缺少的“日志”变量进行折扣。