質問

私は拡張機能を作成しようとしています "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されています
役に立ちましたか?

解決

私は、これは非常に古い答えた質問です実現が、私はアスカー式を探していたので、選択した答えは、誤解を招くと思うし、選択した答えはラムダを提供しています。

このはの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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top