Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Membandingkan Ungkapan Lambda dengan Cekap untuk Kesaksamaan?

Bagaimanakah Saya Boleh Membandingkan Ungkapan Lambda dengan Cekap untuk Kesaksamaan?

Barbara Streisand
Barbara Streisandasal
2025-01-03 19:56:38644semak imbas

How Can I Efficiently Compare Lambda Expressions for Equality?

Cara Paling Cekap untuk Menguji Kesamaan Ungkapan Lambda

Masalah

Pertimbangkan tandatangan kaedah:

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

Bagaimana boleh anda cekap menentukan sama ada dua ungkapan lambda adalah sama? Kaedah ini hanya boleh mengendalikan ungkapan mudah, khususnya MemberExpressions dalam bentuk c => c.ID.

Jawapan

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

Kaedah ini membandingkan ungkapan dengan memecahkannya kepada bahagian konstituennya dan membandingkan setiap bahagian secara individu. Ia tidak melakukan perbandingan AST penuh, tetapi sebaliknya meruntuhkan sebarang ungkapan malar dan membandingkan nilainya secara langsung.

Butiran Pelaksanaan

Pelaksanaan kaedah ExpressionsEqual membandingkan secara rekursif bahagian berlainan ungkapan. Sebagai contoh, jika ungkapan adalah MemberExpressions, ia membandingkan sifat Ahli bagi setiap ungkapan. Jika ia BinaryExpressions, ia membandingkan sifat Kaedah, Kiri dan Kanan.

Kaedah ini mengendalikan kes khas seperti ConditionalExpressions dan NewArrayExpressions. Ia juga mengendalikan kes di mana ungkapan mempunyai jenis yang berbeza, termasuk jenis tanpa nama.

Prestasi

Prestasi kaedah ini jauh lebih baik daripada perbandingan AST penuh, terutamanya untuk ungkapan yang mengandungi nilai tetap. Ini menjadikannya sesuai untuk kes penggunaan seperti pengesahan olok-olok, di mana ungkapan lambda mungkin merujuk pembolehubah setempat yang harus dibandingkan mengikut nilai.

Pakej NuGet

Kod ini tersedia sebagai pakej NuGet, yang boleh dipasang menggunakan arahan berikut:

Install-Package LambdaCompare

Penggunaan

Penggunaan kaedah Eq ialah mudah:

var f1 = GetBasicExpr1();
var f2 = GetBasicExpr2();
Assert.IsTrue(LambdaCompare.Eq(f1, f2));

Kesimpulan

Kaedah yang cekap untuk membandingkan ungkapan lambda ini menyediakan cara yang mudah dan berprestasi untuk menentukan kesamarataan mereka. Ia amat berguna dalam senario di mana nilai pembolehubah tempatan perlu dibandingkan.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Membandingkan Ungkapan Lambda dengan Cekap untuk Kesaksamaan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn