>백엔드 개발 >C++ >C#에서 람다 식의 동등성을 어떻게 효율적으로 비교할 수 있습니까?

C#에서 람다 식의 동등성을 어떻게 효율적으로 비교할 수 있습니까?

Patricia Arquette
Patricia Arquette원래의
2025-01-05 19:57:41881검색

How Can We Efficiently Compare the Equality of Lambda Expressions in C#?

람다 표현식의 동등성을 효율적으로 비교

과제:
메서드 시그니처 제공:

public bool AreTheSame<T>(Expression<Func<T, object>> exp1, Expression<Func<T, object>> exp2) 

두 표현식이 동일한지 확인하는 가장 효과적인 방법을 결정하십시오. 이 평가는 c =>와 같은 간단한 MemberExpression만 지원해야 합니다. c.ID.

제안된 솔루션:
배열, 새로운 연산자 등을 지원하는 Marc 코드의 최적화된 버전이 아래에 제시되어 있습니다. AST를 비교하는 보다 우아한 방법을 사용합니다.

public static class LambdaCompare
{
    public static bool Eq<TSource, TValue>(
        Expression<Func<TSource, TValue>> x,
        Expression<Func<TSource, TValue>> y)
    {
        return ExpressionsEqual(x, y, null, null);
    }

    ...

    private static bool ExpressionsEqual(Expression x, Expression y, LambdaExpression rootX, LambdaExpression rootY)
    {
        ...
    }

    ...
}

자세한 설명:

  • 이 코드는 이전에 참조로 두 표현식이 동일한지 확인합니다. 값별로 비교합니다.
  • 둘 다 상수 표현식인지 평가하고, 그렇다면 상수 표현식을 결정합니다. 값.
  • 식이 동일한 유형이 아닌 경우 함수는 false를 반환합니다.
  • 람다 식의 경우 매개변수와 식의 본문을 비교합니다.
  • 멤버의 경우 표현식의 경우 멤버와 기본 표현식을 비교합니다.
  • 이진 표현식의 경우 메서드, 왼쪽 표현식 및 오른쪽 표현식을 비교합니다.
  • 단항 표현식의 경우 메서드와 피연산자를 비교합니다.
  • 매개변수 표현식의 경우 매개변수 목록의 인덱스를 비교합니다.
  • 메서드 호출 표현식의 경우 메소드, 객체 및 인수를 비교합니다.
  • 멤버 init 표현식의 경우 새 표현식과 멤버를 비교합니다. 바인딩.
  • 새 배열 표현식의 경우 요소를 비교합니다.
  • 새 표현식의 경우 생성자, 인수 및 멤버를 비교합니다.
  • 조건식의 경우 요소를 비교합니다. 테스트, false인 경우, true인 경우 표현식.
  • 위 기준 중 어느 것도 일치하지 않으면 함수는 NotImplementedException.

장점:

  • 다양한 표현 유형을 지원합니다.
  • AST를 보다 효율적이고 우아하게 비교합니다.
  • NuGet 패키지로 사용 가능 통합.

위 내용은 C#에서 람다 식의 동등성을 어떻게 효율적으로 비교할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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