>백엔드 개발 >C++ >람다 표현식의 동등성을 효율적으로 비교할 수 있는 방법은 무엇입니까?

람다 표현식의 동등성을 효율적으로 비교할 수 있는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2025-01-03 19:56:38597검색

How Can I Efficiently Compare Lambda Expressions for Equality?

람다 표현식의 동일성을 테스트하는 가장 효율적인 방법

문제

메서드 서명을 고려하세요.

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 패키지

코드는 NuGet 패키지로 제공됩니다. 다음 명령을 사용하여 설치할 수 있습니다:

Install-Package LambdaCompare

사용법

Eq 방법의 사용법은 다음과 같습니다. 간단함:

var f1 = GetBasicExpr1();
var f2 = GetBasicExpr2();
Assert.IsTrue(LambdaCompare.Eq(f1, f2));

결론

람다 표현식을 비교하는 이 효율적인 방법은 동등성을 판단하는 편리하고 효과적인 방법을 제공합니다. 이는 지역 변수 값을 비교해야 하는 시나리오에서 특히 유용합니다.

위 내용은 람다 표현식의 동등성을 효율적으로 비교할 수 있는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.