Frage

Ich versuche, eine Erweiterung "WhereNot"

zu erstellen

So kann ich verwenden:

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

Beachten Sie, dass mein Ziel hier ist Linq Ausdrücke zu lernen; nicht mein Problem lösen.

I craated diese Funktion:

 <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

Ich weiß nicht, wie die boolean-Flag zu wechseln, wird die Funktion Negieren es tun?

Antworten in beiden vb.net und C # sind welcommed

War es hilfreich?

Lösung

Ich weiß, dies ist eine sehr alte Frage beantwortet, aber ich denke, dass die gewählte Antwort ist irreführend, da die Fragesteller für einen Ausdruck waren auf der Suche, und die gewählte Antwort liefert eine Lambda.

Das bedeutet, dass ihr Aufruf von einem IQueryable wird ein IEnumerable<T> zurückkehren, keinen IQueryable<T>. Dies zwingt den Ausdruck zu kompilieren, und kann zu schlecht optimierten Zugang zu Linq-Anbieter führen.

Hier ist eine Antwort, die direkt auf die ursprüngliche Frage befasst.

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

Andere Tipps

Ja, ein Negieren Verfahren wie diese werden Ihnen helfen:

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

Und dann verwenden, wie folgt aus:

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

oder mit einem WhereNot () -Methode wie folgt aus:

<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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top