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

C# でラムダ式の等価性を効率的に比較するにはどうすればよいですか?

Patricia Arquette
リリース: 2025-01-05 19:57:41
オリジナル
892 人が閲覧しました

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) 
ログイン後にコピー

2 つの式が同等かどうかを確認する最も効果的な方法を決定します。この評価は、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)
    {
        ...
    }

    ...
}
ログイン後にコピー

詳細な説明:

  • このコードは、2 つの式が参照によって同じであるかどうかを前にチェックします。
  • それらが両方とも定数式であるかどうかを評価し、そうであれば、その値を決定します。値。
  • 式が同じ型でない場合、関数は false を返します。
  • ラムダ式の場合、パラメータと式の本体が比較されます。
  • メンバーの場合式の場合、メンバーと基になる式を比較します。
  • バイナリ式の場合、メソッド、左の式、右の式を比較します。式。
  • 単項式の場合、メソッドとオペランドを比較します。
  • パラメータ式の場合、パラメータ リスト内のインデックスを比較します。
  • メソッド呼び出し式の場合、それはメソッド、オブジェクト、および引数を比較します。
  • メンバーの初期化式の場合、新しい式とメンバーを比較します。バインディング。
  • 新しい配列式の場合、要素を比較します。
  • 新しい式の場合、コンストラクター、引数、メンバーを比較します。
  • 条件式の場合、比較します。テスト、false の場合、および true の場合の式。
  • 上記の基準のいずれも一致しない場合、関数はNotImplementedException.

利点:

  • 幅広い式タイプをサポートします。
  • より効率的かつエレガントな方法で AST を比較します。
  • NuGet パッケージとして利用可能簡単に統合できます。

以上がC# でラムダ式の等価性を効率的に比較するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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