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
Lepaskan: 2025-01-03 19:56:38
asal
585 orang telah melayarinya

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)
Salin selepas log masuk

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);
}
Salin selepas log masuk

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
Salin selepas log masuk

Penggunaan

Penggunaan kaedah Eq ialah mudah:

var f1 = GetBasicExpr1();
var f2 = GetBasicExpr2();
Assert.IsTrue(LambdaCompare.Eq(f1, f2));
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan