Setiap kali saya melihat pertanyaan yang diposting di Stack Overflow pada C #, saya melihat setidaknya satu atau dua jawaban diposting yang memecahkan masalah dengan LINQ. Biasanya orang dengan reputasi sangat tinggi tampaknya menggunakan LINQ seperti pro.
Jadi pertanyaan saya adalah, untuk apa domain LINQ seharusnya digunakan?
Juga pada catatan tambahan: Apakah ada tujuan yang harus dihindari? Apakah ukuran dataset mempengaruhi kinerja kueri LINQ?
c#
linq
professional-development
pengguna1816120
sumber
sumber
Jawaban:
LINQ terutama dirancang untuk memungkinkan pertanyaan fungsional murni dan transformasi pada urutan data (Anda akan melihat bahwa semua ekstensi LINQ mengambil delegasi Func tetapi bukan delegasi Action). Akibatnya kasus loop yang paling umum yang tidak cocok dengan LINQ dengan sangat baik adalah yang semua tentang efek samping fungsional non-murni, misalnya
Untuk menjadi lebih baik dalam menggunakan LINQ, cukup berlatih menggunakannya.
Setiap kali Anda akan menulis
for
atauforeach
mengulang untuk melakukan sesuatu dengan koleksi, berhenti, pertimbangkan apakah itu cocok untuk LINQ (yaitu tidak hanya melakukan efek / efek samping pada elemen), dan jika demikian paksa diri Anda untuk menulis menggunakan LINQ.Anda juga bisa menulis
foreach
versi terlebih dahulu kemudian menulis ulang ke versi LINQ.Seperti yang ditunjukkan oleh svick, LINQ seharusnya membuat program Anda lebih mudah dibaca. Biasanya bagus dalam hal ini karena cenderung menekankan maksud kode daripada mekanisme; namun jika Anda tidak dapat membuat kueri Anda lebih mudah dibaca daripada loop sederhana, jangan ragu untuk tetap menggunakan loop.
Jika Anda perlu latihan untuk berlatih, sebagian besar latihan pemrograman fungsional akan dipetakan dengan baik ke LINQ misalnya 99 masalah (terutama 20 pertama atau lebih) atau proyek euler .
sumber
Aggregate()
. Saya pikir sebagian besar waktu, loop lebih mudah dibaca.Untuk menjawab pertanyaan yang diedit: singkatnya, akan bermanfaat untuk menggunakan LINQ setiap kali Anda harus mengimplementasikan fungsionalitas "permintaan" (itulah yang dimaksud dengan Q dalam LINQ). Mendefinisikan domain yang tepat itu sulit, tetapi sangat menyederhanakan berbagai tugas yang terkait dengan mengekstraksi dan memanipulasi data dari koleksi.
Untuk menguraikan sedikit, banyak fungsi permintaan telah dibawa langsung ke dalam bahasa (atau lebih tepatnya, berbagai LINQ-implementors), sehingga hal-hal seperti agregasi, pemesanan, pengelompokan, pemfilteran, proyeksi, bergabung (dan banyak lagi) semuanya ditangani untuk kamu. Solusi berbasis LINQ juga biasanya jauh lebih pendek daripada jika Anda mengimplementasikannya "dengan tangan", dan juga mengomunikasikan maksud mereka jauh lebih baik.
Contoh sederhana yang sering membantu menyampaikan kekuatan LINQ adalah menampilkan konten direktori, dikelompokkan berdasarkan ekstensi. Jalankan melalui implementasi imperatif khas di kepala Anda - akan ada banyak detail implementasi sudah di awal. Mungkin kita akan menggunakan a
Dictionary<String, List<String>>
untuk mengindeks file dengan ekstensi. Tentu saja, kita harus memeriksa apakah kunci sudah ada, instantiate daftar, tambahkan, dll. Mungkin ada sesuatu seperti:Pertimbangkan padanan LINQ:
Perhatikan bahwa kueri itu sendiri hanya 2 baris, tentu saja lebih pendek daripada solusi imperatif apa pun yang dapat kami buat. Ini juga cukup mudah dibaca; rasio signal-to-noise lebih tinggi daripada dengan solusi pertama. Bagi yang baru mengenal LINQ, Anda akan menampilkan hasil permintaan itu sebagai berikut:
Dengan contoh-contoh yang lebih kompleks, perbedaan biasanya menjadi lebih luas (misalnya, hanya mengelompokkan berdasarkan beberapa bidang). Jadi, untuk meringkas, LINQ memecahkan banyak masalah query data "sehari-hari" dengan cara yang seringkali lebih pendek dan lebih deskriptif diri. Ini datang dengan biaya ringan karena harus mempelajari sintaks dan teknologi, tetapi manfaatnya jauh lebih besar daripada yang negatif.
sumber
Berbagai bahasa telah dikembangkan dari waktu ke waktu untuk berbagai jenis sumber data, misalnya SQL untuk basis data relasional dan XQuery untuk XML. Oleh karena itu, pengembang harus mempelajari bahasa permintaan baru untuk setiap jenis sumber data atau format data yang harus mereka dukung. LINQ menyederhanakan situasi ini dengan menawarkan model yang konsisten untuk bekerja dengan data di berbagai jenis sumber data dan format. Dalam kueri LINQ, Anda selalu bekerja dengan objek. untuk lebih lanjut kunjungi http://msdn.microsoft.com/en-us/library/bb397906.aspx
sumber