【发布时间】:2019-09-16 07:54:48
【问题描述】:
我有当前代码,它使用 LINQ 从 id 列表中选择经过验证的 id:
var ids = idList
.Select(page => page.PageId?? -1)
.Where(id => id > -1)
.Distinct()
.ToArray();
在我的应用程序中,我经常使用这段代码片段,我想知道是否可以将这段代码包装在另一个函数中,并将两个 lambda 表达式作为参数传递以缩短它。
类似:
int[] pageIds = getIdsOfPages(page => page.Id ?? -1, id => id > -1);
我可以实现这个吗?我该怎么做?
我见过 lambda 表达式和函数,但到目前为止我还没有运气。 Expression<Func<Object, Bool>> & Func<Object, Bool>.
P.s 第二个参数 id > -1。那将是一个常数..只有第一个参数会改变。
提前致谢。
编辑:
这是我当前的实现: 调用方法:
public int[] getPageIds(List<PageObject> pageHeadersList){
IQueryable<DataModel.PageHeader> list = pageHeadersList.AsEnumerable().AsQueryable();
int[] pageIds = list.GetIds(x => x.PageId ?? -1);
return pageIds;
}
public static IQueryable<T> ExecuteWhereClause<T>(IQueryable<T> inputQuery, string paramName, object typedValue)
{
ParameterExpression parameter = Expression.Parameter(typeof(T));
var condition =
Expression.Lambda<Func<T, bool>>(
Expression.GreaterThan(
Expression.Property(parameter, paramName),
Expression.Constant(typedValue)
),
parameter
);
return inputQuery.Where(condition);
}
public static int[] GetIds<TSource, TKey>(this IQueryable<TSource> list, Func<TSource, TKey> keySelector)
{
var newList = list.Select(keySelector)
.AsQueryable();
var newListAfterWhere = ExecuteWhereClause(newList , "Id", -1);
return newListAfterWhere .Cast<int>().ToArray();
}
【问题讨论】:
-
不知道所涉及的类型很难提供帮助。请您提供minimal reproducible example,包括您尝试过的内容及其产生的错误吗?
-
@JonSkeet 我已更新问题以包含当前代码库
-
public int[] getPageIds(pageHeadersList)不是有效的方法声明。它缺少参数的类型,这是最重要的方面之一。 -
嗯。您使用表达式树有什么特别的原因吗?我相信如果你坚持使用委托,代码会更简单。
-
@JonSkeet 首先我了解到表达式树非常强大,尤其是与 LINQ 结合使用时。我也只是在探索如何重构此类代码的可能性。这就是我使用表达式树的原因。到目前为止,我的代码中有很多委托使用。不惜一切代价减少这一点对我的代码库来说是一个巨大的胜利。
标签: c# linq lambda refactoring expression