3

拡張機能「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# の両方での回答を歓迎します

4

2 に答える 2

12

これは非常に古い回答の質問であることは認識していますが、質問者が式を探していて、選択された回答がラムダを提供するため、選択された回答は誤解を招くと思います。

これは、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());
    }
}
于 2010-12-19T07:19:44.017 に答える
1

はい、次のような Negate メソッドが役立ちます。

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
于 2010-02-15T05:01:10.057 に答える