LINQ dan Extension Method

Katakanlah kita mempunyai sebuah objek array dengan nama arrayNama. Setelah mendeklarasikan objek array ini, untuk menggunakannya kembali biasanya kita mengetik nama dari array tersebut dan selanjutnya menekan tanda "titik" untuk mengaktfkan intellisense. Pada saat kita menggunakan intellisense akan muncul method-method yang disarankan oleh intellisense.

Gambar 1. Extension Method.

 

Gambar di atas adalah gambar dari sebuah intellisense yang menampilkan method-method yang disarankan untuk operasi apa yang akan kita lakukan. Extension method terindikasi dari tanda panah biru yang menghadap ke bawah. Method Select, Single, Sum, Max dan lain-lain berkaitan erat dengan operasi-operasi menggunakan LINQ dan merupakan operator standar dari operasi LINQ.

 

Contoh penggunaan LINQ dalam kehidupan sehari-hari seorang programmer

Pada tulisan ini, saya ingin menampilkan contoh yang biasa saya gunakan untuk memecahkan berbagai persoalan dengan menggunakan LINQ. Mungkin bagi para pembaca masih terlalu basic, hehehe. Prinsipnya begini, selagi semuanya masih bisa dijadikan object maka bisa diselesaikan dengan menggunakan LINQ. Untuk tahap pertama, saya ingin mencoba melakukan berbagai macam operasi string dengan menggunakan LINQ.

Permasalahan:

Ada sebuah kalimat di dalam textbox. Kalimat itu terdiri atas beberapa kata dan karakter.

  1. Hitunglah jumlah kata, karakter, huruf dan angka dalam kalimat tersebut.
  2. Hitung kata apa yang paling sering muncul, dan berapa jumlahnya
  3. Hitung huruf apa yang paling sering muncul dan berapa jumlahnya
  4. Buatkan sebuah textbox yang gunanya untuk memfilter kata. Nanti pada textbox ini, kita masukkan sebuah kata. Dari kata yang kita masukkan ini, hitunglah dalam kalimat ada berapa kata yang cocok dengan kata yang dimasukkan ini.
  5. Buatlah sebuah datagridview, kemudian lakukan pengelompokan kata dan jumlah kemunculannya, tampilkan di datagridview.
  6. Hampir sama dengan nomor 5, tetapi yang dikelompokkan adalah huruf dan jumlah kemunculannya
  7. Hampir sama dengan nomor 5, tetapi yang dikelompokkan adalah angka dan jumlah kemunculannya.

Jika saya memposisikan sebagai mahasiswa yang baru belajar bahasa program, untuk soal nomor 1 mungkin mudah. Nomor 2 mayanlah. Nomor 3 udah mulai berkeringat. Nomor 4 sudah mulai gelisah, liat kiri kanan. Nomor 5, 6, 7 mungkin dah pingsan di kelas.

Tetapi hal-hal di atas ternyata sangat mudah diselesaikan dengan operasi LINQ.

Untuk soal nomor 1 bagian hitung kata, penyelesaian ala LINQ nya adalah:

Dim kata As String() = txtKalimat.Text.Split(New Char() {}, StringSplitOptions.RemoveEmptyEntries)
Dim jumlahKata As Integer = kata.Count
MessageBox.Show(jumlahKata)

Sebenarnya sintax di atas belum masuk query syntax dari LINQ, tapi menggunakan extension method Count, yang mana method ini masi erat hubungannya dalam operasi-operasi LINQ

Untuk soal nomor 1 bagian hitung char, penyelesaian ala LINQ nya sbb:

Dim jumlahChar As Integer = (From chars In txtKalimat.Text Select chars).Count

Masih termasuk mudahlah ini. Padanannya juga dengan fungsi Length, kita dapat menghitung panjang char dari suatu kalimat.

Untuk soal nomor 1 bagian hitung jumlah huruf (bukan spasi, angka, tanda titik dll), penyelesaian LINQ nya sbb:

Dim huruf = (From kalimat In txtKalimat.Text Where Char.IsLetter(kalimat) Select kalimat).Count

Disini sudah mulai dirasakan enaknya penggunaan LINQ. Kalau cara ga pake LINQ, dalam bayangan saya mungkin melakukan pengulangan terhadap kalimat, terus di cek apakah huruf atau bukan (biasanya sih pengecekan dengan ASCII), jika termasuk huruf, maka tambahkan ke result integer, jika tidak maka tidak ada penambahan. Hmmm.. dah kebayang juga sih ribetnya. Itu masih di case hitung huruf. Kalau hitung angka gimana? ASCII nya ganti lagi. Dengan LINQ, kita hanya modifikasi baris di atas, di bagian Char.IsLetter(kalimat) tinggal kita ganti ke Char.IsDigit(kalimat). Selesai. 🙂

Lanjut ke soal Nomor 2. Kalau cara yang paling awam untuk soal nomor dua adalah, lakukan split, kemudian lakukan looping insert ke database. Selanjutnya lakukan query dengan group by kata. Letakkan di view, lakukan query kedua dengan sintax sql : "select top 1 from namaView order by jumlah descenting". Sudah bisa dibayangkan berapa baris sintax nya…

Dengan LINQ, konsep yang sama bisa diselesaikan seperti berikut:

Dim kata As String() = txtKalimat.Text.Split(New Char(){}, StringSplitOptions.RemoveEmptyEntries)
Dim maxKata = From k In kata Group By k Into Group Select textKata = k, jumlah = Group.Count Order By jumlah Descending
Dim kataTerbanyak = maxKata.First

MessageBox.Show("Kata yang paling banyak muncul adalah: " & kataTerbanyak.textKata & vbCrLf & "Sebanyak :" & kataTerbanyak.jumlah)

Baris pertama melakukan split dari kalimat. Baris kedua lumayan ribet lah.

  1. From k In Kata => masih LINQ biasa
  2. Group By k => melakukan penggrupan seperti pada query di sql
  3. Into Group => biasanya dilakukan ke alias group, atau ke group itu sendiri.
  4. Select textKata = k, jumlah = Group.Count => melakukan select yang terbaru akibat dari penggrupan yang dilakukan sebelumnya.
  5. Order By jumlah Descending => melakukan urutan data dari jumlah yang paling besar ke paling kecil. So coba pembaca bayangkan, sekarang data kita sudah terurut berdasarkan jumlah dari yang besar ke kecil. Sekarang tinggal ambil yang terbesar dari kumpulan data itu, yang berada di urutan pertama. Untuk mengambilnya gunakan method First. Selanjutnya kita tinggal mengakses nama "field", textKata dan jumlah.
  6. Ribet? iya sih, tapi menyelesaikan problem ini dengan 3 atau 4 baris, saya anggap "sesuatu" . :p

Untuk soal nomor 3, dengan LINQ kita selesaikan aja dengan method Where seperti berikut:

Dim hurufLINQ = From l In txtKalimat.Text Where Char.IsLetter(l) Group l By key = l Into Group Select huruf = key, jumlah = Group.Count
Dim hurufTerbanyak = hurufLINQ.First
MessageBox.Show("Huruf yang paling banyak muncul adalah: " & hurufTerbanyak.huruf & vbCrLf & "Sebanyak :" & hurufTerbanyak.jumlah)

Untuk soal nomor 4, prinsipnya sama dengan nomor 3. Hanya menggunakan Where saja, tidak melakukan grouping dulu.

Dim kata As String() = txtKalimat.Text.Split(New Char() {}, StringSplitOptions.RemoveEmptyEntries)
Dim jumlahKata As Integer = (From intkata In kata Where intkata = txtFilter.Text Select intkata).Count
MessageBox.Show(jumlahKata)

Mungkin setelah sampai di problem nomor 4, para pembaca sudah mulai mengerti mengenai pembicaraan kita tentang LINQ ini. Biar ndak bertele-tele dengan pembicaraan saya ini, maka saya sertakan file yang telah saya buat dengan menggunakan visual studio 2008. Termasuk di dalamnya ada pemecahan masalah untuk nomor 5, 6 dan 7. Tambahan lainnya adalah operasi-operasi pada angka. Mencari nilai tertinggi, terendah, jumlah, bilangan ganjil, bilangan genap dll.

Silahkan download dimari: http://www.mediafire.com/?mvejcnic3iobjuq

Dimanakah anda sekarang ini?

1. Sudah mengenal Extension Method

2. Memecahkan masalah pada operasional string dengan menggunakan LINQ to Object.

Harapan saya, sesudah membaca artikel ini, para pembaca mulai tertarik untuk menyelesaikan masalah dengan bantuan LINQ. Pokoknya apapun yang bisa dijadikan object, bisa di selesaikan dengan LINQ.

 

Leave a Reply

Your email address will not be published. Required fields are marked *