Question

Je suis en train de créer une extension "WhereNot"

Je peux donc utiliser:

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

Notez que mon but ici est d'apprendre des expressions LINQ; pas résoudre mon problème.

Je craated cette fonction:

 <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

Je ne sais pas comment changer le drapeau booléen, sera la fonction Négation faire?

réponses à la fois vb.net et C # sont welcommed

Était-ce utile?

La solution

Je sais que c'est une question très ancienne réponse, mais je pense que la réponse choisie est trompeuse, parce que le demandeur cherchait une expression, et la réponse choisie fournit un lambda.

Cela signifie que son invocation d'un IQueryable retourne un IEnumerable<T>, pas IQueryable<T>. Cela force l'expression à compiler, et peut conduire à un accès mal optimisé aux fournisseurs Linq.

Voici une réponse qui aborde directement la question initiale.

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());
    }
}

Autres conseils

Oui une méthode Négation comme cela vous aidera à:

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

Et puis utiliser comme ceci:

Dim x = "Hello world "
Dim y = x.Split.Where(Negate(Of String)(AddressOf String.IsNullOrEmpty))

Ou avec une méthode WhereNot () comme ceci:

<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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top