将lambda函数作为参数传递,并在方法主体中提供其参数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将lambda函数作为参数传递,并在方法主体中提供其参数相关的知识,希望对你有一定的参考价值。
[我有一种方法可以处理插件的一些分页逻辑;
public async Task<JsonResult> DataPagination()
{
List<GLAccountModel> glAccounts = await HttpClientHelper.GetListHttpResponseAsync<GLAccountModel>(httpBaseAdress, "GLAccount", "GetAll");
var (filteredResultCount, totalRecord) = DataTableHelper.ManageDataTable(glAccounts, Request, x => x.Name.Contains());
return Json(new { data = glAccounts, draw = Request["draw"], recordsTotal = totalRecord, recordsFiltered = filteredResultCount });
}
[这里,我将lambda函数x => x.Name.Contains()
传递给ManageDataTable
方法。这是ManageDataTable
方法的实现;
public static (int, int) ManageDataTable<TModel>(List<TModel> models, HttpRequestBase request, Func<TModel, bool> lambdaExpression) where TModel : class
{
string search = request["search[value]"];//arama
if (!string.IsNullOrEmpty(search))
{
models = models.Where(lambdaExpression).ToList();
}
return (filteredResultCount, totalRecord);
}
我希望能够在Contains()
方法的主体中提供ManageDataTable()
方法的参数,而不是随参数本身一起发送。更清楚地说,我想从x => x.Name.Contains()
接收lambda函数ManageDataTable()
,并且在ManageDataTable()
主体内部,我希望能够给Contains()
方法提供参数,这是我的lambda的一部分功能。那可能吗?谢谢。
答案
我可以在这里根据更改方法参数来想到两个选项。您可以像这样将其设置为Func<string, Func<TModel, bool>>
:
public static (int, int) ManageDataTable<TModel>(
List<TModel> models,
HttpRequestBase request,
Func<string, Func<TModel, bool>> filterProvider)
where TModel : class
{
string search = request["search[value]"];//arama
if (!string.IsNullOrEmpty(search))
{
var filter = filterProvider(search);
models = models.Where(filter).ToList();
}
return (filteredResultCount, totalRecord);
}
您会这样称呼:
DataTableHelper.ManageDataTable(glAccounts, Request,
search => model => model.Name.Contains(search));
此方法实际上是高阶方法。或者,您可以像这样输入Func<TModel, string, bool>
:
public static (int, int) ManageDataTable<TModel>(
List<TModel> models,
HttpRequestBase request,
Func<TModel, string, bool> filter)
where TModel : class
{
string search = request["search[value]"];//arama
if (!string.IsNullOrEmpty(search))
{
models = models.Where(model => filter(model, search)).ToList();
}
return (filteredResultCount, totalRecord);
}
您会这样称呼:
DataTableHelper.ManageDataTable(glAccounts, Request,
(model, search) => model.Name.Contains(search));
使用哪一个无关紧要,但是值得您确保他们都理解。
以上是关于将lambda函数作为参数传递,并在方法主体中提供其参数的主要内容,如果未能解决你的问题,请参考以下文章