Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Kita Boleh Membandingkan Kesamaan Ungkapan Lambda dengan Cekap dalam C#?

Bagaimanakah Kita Boleh Membandingkan Kesamaan Ungkapan Lambda dengan Cekap dalam C#?

Patricia Arquette
Lepaskan: 2025-01-05 19:57:41
asal
920 orang telah melayarinya

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

Membandingkan Kesamaan Ungkapan Lambda Dengan Cekap

Cabaran:
Diberi tandatangan kaedah:

public bool AreTheSame<T>(Expression<Func<T, object>> exp1, Expression<Func<T, object>> exp2) 
Salin selepas log masuk

Tentukan kaedah yang paling berkesan untuk memastikan sama ada kedua-dua ungkapan itu setara. Penilaian ini seharusnya hanya menyokong MemberExpressions yang mudah, seperti c => c.ID.

Penyelesaian Cadangan:
Versi kod Marc yang dioptimumkan yang menyokong tatasusunan, pengendali baharu dan banyak lagi dipaparkan di bawah. Ia menggunakan kaedah yang lebih elegan untuk membandingkan 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)
    {
        ...
    }

    ...
}
Salin selepas log masuk

Penjelasan Terperinci:

  • Kod ini menyemak sama ada kedua-dua ungkapan adalah sama melalui rujukan sebelum membandingkan nilai demi nilai.
  • Ia menilai sama ada kedua-duanya adalah ungkapan malar dan, jika ya, menentukan nilainya.
  • Jika ungkapan bukan jenis yang sama, fungsi akan mengembalikan palsu.
  • Untuk ungkapan lambda, ia membandingkan parameter dan kandungan ungkapan.
  • Untuk ungkapan ahli, ia membandingkan ahli dan ungkapan asas.
  • Untuk ungkapan binari, ia membandingkan kaedah, ungkapan kiri, dan ungkapan kanan.
  • Untuk ungkapan unary, ia membandingkan kaedah dan operan.
  • Untuk ungkapan parameter, ia membandingkan indeksnya dalam senarai parameter.
  • Untuk ungkapan panggilan kaedah , ia membandingkan kaedah, objek dan hujah.
  • Untuk ungkapan init ahli, ia membandingkan ungkapan baharu dan ahli pengikatan.
  • Untuk ungkapan tatasusunan baharu, ia membandingkan elemen.
  • Untuk ungkapan baharu, ia membandingkan pembina, hujah dan ahli.
  • Untuk ungkapan bersyarat, ia membandingkan ujian, jika salah, dan jika ungkapan benar.
  • Jika tiada kriteria di atas sepadan, fungsi itu akan mengeluarkan NotImplementedException.

Kelebihan:

  • Menyokong pelbagai jenis ekspresi.
  • Membandingkan AST dalam bentuk yang lebih cekap dan elegan cara.
  • Tersedia sebagai pakej NuGet untuk memudahkan penyepaduan.

Atas ialah kandungan terperinci Bagaimanakah Kita Boleh Membandingkan Kesamaan Ungkapan Lambda dengan Cekap dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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