WhereNot linq выражение - PullRequest
       34

WhereNot linq выражение

3 голосов
/ 15 февраля 2010

Я пытаюсь создать расширение "WhereNot"

Так что я могу использовать:

Dim x = "Hello world "
Dim y = x.Split.WhereNot(AddressOf String.IsNullOrEmpty)

Обратите внимание, что моя цель здесь - выучить выражения linq; не решить мою проблему.

Я разработал эту функцию:

 <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

Я не знаю, как переключить логический флаг, будет ли функция Negate делать это?

приветствуются ответы как на vb.net, так и на C #

Ответы [ 2 ]

11 голосов
/ 19 декабря 2010

Я понимаю, что это очень старый ответ на вопрос, но я думаю, что выбранный ответ вводит в заблуждение, потому что спрашивающий искал выражение, а выбранный ответ дает лямбду.

Это означает, что его вызов из 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());
    }
}
1 голос
/ 15 февраля 2010

Да, такой отрицательный метод поможет вам:

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
...