سؤال

واني اسعى الى خلق التمديد "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>. هذه القوات التعبير إلى ترجمة، ويمكن أن يؤدي إلى وصول سيئة الأمثل لمقدمي ينق.

وهنا هو الجواب الذي يتناول بشكل مباشر على السؤال الأصلي.

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