ホームページ > バックエンド開発 > C++ > ラムダ式が等しいかどうかを効率的に比較するにはどうすればよいですか?

ラムダ式が等しいかどうかを効率的に比較するにはどうすればよいですか?

Barbara Streisand
リリース: 2025-01-03 19:56:38
オリジナル
585 人が閲覧しました

How Can I Efficiently Compare Lambda Expressions for Equality?

ラムダ式の等価性をテストする最も効率的な方法

問題

メソッドのシグネチャを検討してください:

public bool AreTheSame<T>(Expression<Func<T, object>> exp1, Expression<Func<T, object>> exp2)
ログイン後にコピー

どうすればよいですか2 つのラムダ式が等しいかどうかを効率的に判断できますか?このメソッドは、単純な式、特に c => 形式の MemberExpression のみを処理する必要があります。 c.ID.

Answer

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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート