WhereNot LINQ表达式
-
20-09-2019 - |
题
我试图创建扩展 “WhereNot”
因此,我可以使用:
Dim x = "Hello world "
Dim y = x.Split.WhereNot(AddressOf String.IsNullOrEmpty)
请注意,这里我的目标是学习LINQ表达式;没有解决我的问题。
我craated此功能:
<Extension()> _
Public Function WhereNot(Of TElement)(ByVal source As IQueryable(Of TElement), ByVal selector As Expression(Of Func(Of TElement, Boolean))) As IQueryable(Of TElement)
Return source.Where(GetWhereNotExpression(selector))
End Function
我不知道如何切换布尔标志,将函数求反做呢?
在两个vb.net和C#答案welcommed
解决方案
我意识到这是一个很老的回答的问题,但我认为选择的答案是误导,因为提问者一直在寻找一种表达,和所选择的答案提供了一个lambda。
这意味着从一个IQueryable其调用将返回一个IEnumerable<T>
,而不是一个IQueryable<T>
。这迫使编译的表达,并能导致不良优化访问LINQ提供。
下面是一种直接解决了上述原有的问题的答案。
public static class NegationExpressionHelper
{
public static IQueryable<T> WhereNot<T>(this IQueryable<T> queryable, Expression<Func<T,bool>> predicate)
{
return queryable.Where(predicate.Invert());
}
public static Expression<Func<T, bool>> Invert<T>(this Expression<Func<T, bool>> original)
{
return Expression.Lambda<Func<T, bool>>(Expression.Not(original.Body), original.Parameters.Single());
}
}
其他提示
是这样的求反方法将帮助您:
Public Function Negate(Of T)(ByVal predicate As Func(Of T, Boolean)) As Func(Of T, Boolean)
Return Function(x) Not predicate(x)
End Function
和然后使用它是这样的:
Dim x = "Hello world "
Dim y = x.Split.Where(Negate(Of String)(AddressOf String.IsNullOrEmpty))
或者与这样的WhereNot()方法:
<Extension> _
Public Shared Function WhereNot(Of T)(ByVal source As IEnumerable(Of T), ByVal predicate As Func(Of T, Boolean)) As IEnumerable(Of T)
Return source.Where(Negate(predicate))
End Function
不隶属于 StackOverflow