문제

나는 "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

부울 플래그를 전환하는 방법을 모르겠습니다. 함수가 부정할까요?

vb.net과 c#의 답변은 웰컴이 있습니다

도움이 되었습니까?

해결책

나는 이것이 매우 오래된 답변이라는 것을 알고 있지만, 선택한 대답은 오해의 소지가 있다고 생각합니다. 왜냐하면 Asker는 표현을 찾고 있었고 선택된 대답은 Lambda를 제공하기 때문입니다.

이것은 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