メソッドのシグネチャを検討してください:
public bool AreTheSame<T>(Expression<Func<T, object>> exp1, Expression<Func<T, object>> exp2)
どうすればよいですか2 つのラムダ式が等しいかどうかを効率的に判断できますか?このメソッドは、単純な式、特に c => 形式の MemberExpression のみを処理する必要があります。 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 中国語 Web サイトの他の関連記事を参照してください。