首頁 > 後端開發 > C++ > 如何高效比較 C# 中 Lambda 表達式的相等性?

如何高效比較 C# 中 Lambda 表達式的相等性?

Patricia Arquette
發布: 2025-01-05 19:57:41
原創
885 人瀏覽過

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

高效比較Lambda 表達式的相等性

挑戰:
給定方法簽名:

public bool AreTheSame<T>(Expression<Func<T, object>> exp1, Expression<Func<T, object>> exp2) 
登入後複製

確定確定兩個表達式是否等價的最有效方法。此評估應僅支援簡單的MemberExpressions,例如c => 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。
  • 對於 lambda 表達式,它比較表達式的參數和主體。
  • 對於成員表達式,它比較成員和底層表達式。
  • 對於二進位表達式,它比較方法、左表達式和右表達式表達式。
  • 對於一元表達式,它比較方法和運算元。
  • 對於參數表達式,它比較它們在參數列表中的索引。
  • 對於方法呼叫表達式,它比較方法、物件和參數。
  • 對於成員 init 表達式,它比較 new 表達式和成員綁定。
  • 對於新數組表達式,它比較元素。
  • 對於新表達式,它比較建構子、參數和成員。
  • 對於條件式,它比較測試、if false 和 if true 表達式。
  • 如果以上條件都不匹配,則函數會拋出NotImplementedException。

優點:

  • 支援多種表達式類型。
  • 以更有效率、更優雅的方式比較 AST
  • 以 NuGet 套件形式提供輕鬆整合。

以上是如何高效比較 C# 中 Lambda 表達式的相等性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板