Untuk domain masalah apa LINQ dibuat?

12

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?

pengguna1816120
sumber
1
LINQ adalah untuk query grafik objek. Ini adalah Bahasa yang Terintegrasi Kueri - ini memungkinkan Anda untuk melakukan kueri dan memanipulasi koleksi.
Oded
1
mungkin pertanyaan yang bisa ditawar karena mungkin ada pertanyaan yang bagus mengintai di sana pada masalah apa linq yang cocok untuk
jk.
1
Linq bersifat deklaratif. Anda menyatakan "apa" yang Anda inginkan tanpa menentukan "bagaimana" itu dilakukan. Untuk LINQ itu berarti Anda bisa menggunakan kueri untuk menyatakan apa yang Anda inginkan. Kode deklaratif bisa lebih pendek dan lebih mudah dipahami untuk beberapa masalah.
mike30

Jawaban:

16

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

foreach(var x in list) Console.WriteLine(x);

Untuk menjadi lebih baik dalam menggunakan LINQ, cukup berlatih menggunakannya.

Setiap kali Anda akan menulis foratau foreachmengulang 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 foreachversi 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 .

jk.
sumber
Saya mungkin harus menghapus pertanyaan ini sekarang. Moderator berkomentar bahwa itu tidak cocok untuk komunitas .. Jika Anda merasa sebaliknya, tolong beri tahu saya.
user1816120
1
Saya akan menambahkan bahwa jika Anda menulis ulang ke LINQ dan yang asli masih lebih mudah dibaca, simpan yang asli dan hapus versi LINQ. Terkadang, LINQ tidak menambahkan apa pun.
svick
@vivi dalam teori ya, saya tidak yakin saya bisa memikirkan contoh ini;)
jk.
1
@jk. Sebagai contoh, ReSharper terkadang menawarkan untuk mengonversi perulangan saya ke LINQ menggunakan Aggregate(). Saya pikir sebagian besar waktu, loop lebih mudah dibaca.
svick
@svick mungkin masalah tentang apa yang Anda gunakan, meskipun saya akan mengakui bahwa agregat adalah nama yang canggung untuk fold
jk.
1

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:

Dictionary<string, List<string>> fileGroups = new Dictionary<string, List<string>>();

foreach (string file in Directory.GetFiles(Environment.CurrentDirectory))
{
    string extension = Path.GetExtension(file).ToLower();

    if (!fileGroups.ContainsKey(extension))
    {
        fileGroups[extension] = new List<string>();
    }

    fileGroups[extension].Add(file);
}

Pertimbangkan padanan LINQ:

var query = from file in Directory.GetFiles(Environment.CurrentDirectory)
            group file by Path.GetExtension(file).ToLower();

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:

foreach (var fileGroup in query)
{
    Console.WriteLine(String.Format("*** Files with extension: {0}", group.Key));

    foreach (string file in fileGroup)
    {
        Console.WriteLine(file);
    }
}

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.

Daniel B
sumber
Apakah Anda mengklasifikasikan peta atau lipat sebagai "kueri"? Saya tidak benar-benar tetapi saya kira saya bisa melihatnya mungkin .. Saya biasanya berpikir tentang agregat sebagai hasil perhitungan, bukan "permintaan"
Jimmy Hoffa
@JimmyHoffa Saya sebagian besar mengacu pada aplikasi perhitungan untuk koleksi yang mendasarinya, belum tentu perhitungan itu sendiri. Tapi mungkin ada lubang menganga dalam analogi saya, itu dimaksudkan untuk ilustrasi daripada 100% benar.
Daniel B
@JimmyHoffa tidak, tapi kemudian saya tidak yakin apakah ada definisi yang ketat tentang apa yang harus dimulai dengan query
jk.
0

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

Rabbil
sumber
LINQ adalah API abstraksi untuk bekerja dengan koleksi. Beberapa manfaat penting: menggunakan C # Anda mendapatkan STATIC! Verifikasi pertanyaan dan transformasi Anda
AndreasScheinert