我有一个Query表达式,它使用谓词类型和lambda表达式。 我得到了理想的结果。但我不清楚如何评估这个表达式。
我尝试通过使用委托类型在Where
下创建委托和替换条件来打破这个lambda表达式。
如果我必须通过编写委托而不是匿名类型来重写相同的东西。什么是语法。代表将如何返回。
if (((DataTable)dgvAssignedRpm.DataSource).AsEnumerable()
.Where(row => row.Field<long>("FK_RPM_BTN_SETTING_ID") == objRpmButtonHolder.RpmSettingId).Count() > 1)
{
List<DataRow> listPkgBtnSettings = SearchForExistingSettingId();
}
答案 0 :(得分:1)
我认为正确的委托替换将是:
if (((DataTable)dgvAssignedRpm.DataSource).AsEnumerable().Where(
delegate(DataRow row) {
return (row.Field<long>("FK_RPM_BTN_SETTING_ID") == objRpmButtonHolder.RpmSettingId.Count() > 1);
}))
{
List<DataRow> listPkgBtnSettings = SearchForExistingSettingId();
}
但现在是我的早晨,如果我有点离开,请原谅我。
欲望的地方是将DataRow作为参数并返回bool。你可以填写lambda或delegate中的任何内容,只要它匹配这些请求。
问你为何要求Func&lt;&gt;以及它是如何工作的。您使用的语句是LINQ,所以我找到了一个关于这个的参考,这可能比我更好地解释它: http://blogs.msdn.com/b/mirceat/archive/2008/03/13/linq-framework-design-guidelines.aspx
但是,这是Func&lt;&gt;中的最后一种类型它是什么回报。 (但是,我仍然可以推荐使用Lambda表达式,因为它非常干净,整洁并且提供Func&lt;&gt;最佳。
(另外,看看当你写“new Func&lt; ....”时会有什么智慧,它应该让你对Func想要和能做的事情有所了解!)
希望我有所帮助。
答案 1 :(得分:1)
void MethodSignature(...)
{
...
if (((DataTable)dgvAssignedRpm.DataSource).AsEnumerable()
.Where(RowCondition)
{
List<DataRow> listPkgBtnSettings = SearchForExistingSettingId();
}
...
}
// Where want a Func<T,bool> parameter
// T is the first parameter type (DataRow here)
// bool represents the return value
bool RowCondition(DataRow row)
{
return row.Field<long>("FK_RPM_BTN_SETTING_ID") == objRpmButtonHolder.RpmSettingId).Count() > 1
}