메서드 서명을 고려하세요.
public bool AreTheSame<T>(Expression<Func<T, object>> exp1, Expression<Func<T, object>> exp2)
어떻게 할 수 있나요? 두 개의 람다 표현식이 동일한지 효율적으로 판단할 수 있나요? 이 메서드는 간단한 식, 특히 c => 형식의 MemberExpressions만 처리해야 합니다. c.ID.
public static bool Eq<TSource, TValue>( Expression<Func<TSource, TValue>> x, Expression<Func<TSource, TValue>> y) { return ExpressionsEqual(x, y, null, null); }
표현을 구성 부분으로 나누어 각 부분을 개별적으로 비교하는 방법입니다. 전체 AST 비교를 수행하지 않지만 대신 상수 표현식을 축소하고 해당 값을 직접 비교합니다.
ExpressionsEqual 메서드 구현은 표현식의 여러 부분을 재귀적으로 비교합니다. 예를 들어 식이 MemberExpressions인 경우 각 식의 Member 속성을 비교합니다. BinaryExpressions인 경우 Method, Left 및 Right 속성을 비교합니다.
이 메서드는 ConditionalExpressions 및 NewArrayExpressions와 같은 특수 사례를 처리합니다. 또한 익명 유형을 포함하여 표현식에 다양한 유형이 있는 경우도 처리합니다.
이 방법의 성능은 전체 AST 비교보다 훨씬 우수하며 특히 상수 값이 포함된 표현식의 경우 더욱 그렇습니다. 따라서 람다 식이 값으로 비교되어야 하는 로컬 변수를 참조할 수 있는 모의 유효성 검사와 같은 사용 사례에 적합합니다.
코드는 NuGet 패키지로 제공됩니다. 다음 명령을 사용하여 설치할 수 있습니다:
Install-Package LambdaCompare
Eq 방법의 사용법은 다음과 같습니다. 간단함:
var f1 = GetBasicExpr1(); var f2 = GetBasicExpr2(); Assert.IsTrue(LambdaCompare.Eq(f1, f2));
람다 표현식을 비교하는 이 효율적인 방법은 동등성을 판단하는 편리하고 효과적인 방법을 제공합니다. 이는 지역 변수 값을 비교해야 하는 시나리오에서 특히 유용합니다.
위 내용은 람다 표현식의 동등성을 효율적으로 비교할 수 있는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!