Memakai Collections Di C#


Sama seperti bahasa pemograman lainnya, C# juga menyediakan struktur data collections. Saya akan menemukan beberapa class di namespace System.Collections.Generic seperti List, Dictionary, HashSet, LinkedList, Queue, Stack dan sebagainya. Berbekal pengetahuan memakai class serupa di Java, saya tidak menemukan banyak kesulitan untuk memakai collections di C#.

Sebagai contoh, berikut ini adalah kode program yang memakai List:

using System.Collections.Generic;
using System.Linq;
using System.Text;
using Domain;
using System;

namespace Latihan
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Mahasiswa> daftarMahasiswa = new List<Mahasiswa>();
            daftarMahasiswa.Add(new Mahasiswa() { Nim = "11223344", Nama = "Solid Snake" });
            daftarMahasiswa.Add(new Mahasiswa() { Nim = "11223355", Nama = "Liquid Snake" });
            daftarMahasiswa.Add(new Mahasiswa() { Nim = "11223366", Nama = "Big Boss" });

            foreach (Mahasiswa mahasiswa in daftarMahasiswa)
            {
                Console.WriteLine(mahasiswa);
            }

            Console.ReadKey();
        }
    }
}

Sebagai perbandingan, berikut ini adalah versi kode program Java-nya:

package main;

import domain.Mahasiswa;
import java.util.ArrayList;
import java.util.List;

public class Program {

    public static void main(String[] args) {
        List<Mahasiswa> daftarMahasiswa = new ArrayList<Mahasiswa>();

        Mahasiswa m1 = new Mahasiswa();
        m1.setNim("11223344");
        m1.setNama("Solid Snake");

        Mahasiswa m2 = new Mahasiswa();
        m2.setNim("11223355");
        m2.setNama("Liquid Snake");

        Mahasiswa m3 = new Mahasiswa();
        m3.setNim("11223366");
        m3.setNama("Big Boss");

        daftarMahasiswa.add(m1);
        daftarMahasiswa.add(m2);
        daftarMahasiswa.add(m3);

        for(Mahasiswa mahasiswa: daftarMahasiswa) {
            System.out.println(mahasiswa);
        }
    }
}

Pada Java, saya dapat menggunakan diamond operator dalam mendeklarasikan collections yang mengandung generics seperti berikut ini:

List<Mahasiswa> daftarMahasiswa = new ArrayList<>();
Map<String, List<Mahasiswa>> kategori = new HashMap<>();

Perhatikan bahwa pada sisi kanan ekspresi, saya cukup menggunakan operator <> sehingga tidak perlu mengulangi informasi generic di sisi kiri. Bahasa C# tidak memiliki fasilitas serupa. Sebagai gantinya, C# memiliki keyword var yang mirip seperti keyword auto di C++ 11 (baca artikel Pengenal C++ Modern). Keyword var dapat menentukan tipe data secara otomatis berdasarkan ekspresi yang diberikan. Dengan demikian, kode program versi Java di atas dapat ditulis menjadi versi C# berikut ini:

var daftarMahasiswa = new ArrayList<Mahasiswa>();

Salah satu kelebihan C# 4 dibandingkan dengan Java 7 adalah ia sudah mendukung closure. Dengan demikian, saya dapat melakukan penyaringan pada List secara mudah. Sebagai contoh, kode program C# berikut ini hanya akan menampilkan mahasiswa yang namanya mengandung kata ‘Snake’:

using System.Collections.Generic;
using System.Linq;
using System.Text;
using Domain;
using System;

namespace Latihan
{
    class Program
    {
        static void Main(string[] args)
        {
            var daftarMahasiswa = new List<Mahasiswa>();
            daftarMahasiswa.Add(new Mahasiswa() { Nim = "11223344", Nama = "Solid Snake" });
            daftarMahasiswa.Add(new Mahasiswa() { Nim = "11223355", Nama = "Liquid Snake" });
            daftarMahasiswa.Add(new Mahasiswa() { Nim = "11223366", Nama = "Big Boss" });

            var mahasiswaSnake = daftarMahasiswa.FindAll(m => m.Nama.Contains("Snake"));
            foreach (Mahasiswa mahasiswa in mahasiswaSnake)
            {
                Console.WriteLine(mahasiswa);
            }

            Console.ReadKey();
        }
    }
}

Pada kode program di atas, ekspresi m => m.Nama.Contains("Snake") adalah apa yang disebut sebagai lambda expression. Java baru akan mendukung ekspresi seperti ini di Java 8. Sementara itu, Groovy sudah terlebih dahulu mendukungnya melalui closure. Sebagai contoh, berikut ini adalah kode program Groovy untuk program di atas:

List daftarMahasiswa = [
    new Mahasiswa(nim: "11223344", nama: "Solid Snake"),
    new Mahasiswa(nim: "11223355", nama: "Liquid Snake"),
    new Mahasiswa(nim: "11223366", nama: "Big Boss")
]

daftarMahasiswa.findAll { it.nama.contains("Snake") }.each {
    println it
}

Bagian yang saya suka dari Groovy adalah kemampuannya untuk melakukan inisialisasi List pada saat mendeklarasikannya. Tapi C# 4 juga punya kemampuan tersebut. Sebagai contoh, saya dapat membuat kode program C# seperti berikut ini:

var daftarMahasiswa = new List 
{
   new Mahasiswa() { Nim = "11223344", Nama = "Solid Snake" },
   new Mahasiswa() { Nim = "11223355", Nama = "Liquid Snake" },
   new Mahasiswa() { Nim = "11223366", Nama = "Big Boss" }
};

C# juga mendukung anonymous type yang dapat dipakai bila saya tidak ingin menciptakan sebuah class baru, melainkan hanya ingin membuat sebuah class perantara saja. Secara OOP, ini memang terasa aneh, apalagi pada sebuah bahasa statis seperti C# dan Java. Tapi yang pasti, saya dapat mengubah kode program di atas menjadi seperti berikut ini:

using System.Collections.Generic;
using System.Linq;
using System.Text;
using Domain;
using System;

namespace Latihan
{
    class Program
    {
        static void Main(string[] args)
        {
            var daftarMahasiswa = new[] 
            {
                new { Nim = "11223344", Nama = "Solid Snake" },
                new { Nim = "11223355", Nama = "Liquid Snake" },
                new { Nim = "11223366", Nama = "Big Boss" }
            }.ToList();

            var mahasiswaSnake = daftarMahasiswa.FindAll(m => m.Nama.Contains("Snake"));
            foreach (var mahasiswa in mahasiswaSnake)
            {
                Console.WriteLine(mahasiswa);
            }

            Console.ReadKey();
        }
    }
}

Kode program di atas kini tidak membutuhkan class Mahasiswa lagi. Java tidak mendukung penerapan serupa, tetapi Groovy mendukungnya melalui apa yang disebut sebagai Expando seperti yang terlihat pada kode program berikut ini:

List daftarMahasiswa = [
    new Expando(nim: "11223344", nama: "Solid Snake"),
    new Expando(nim: "11223355", nama: "Liquid Snake"),
    new Expando(nim: "11223366", nama: "Big Boss")
]

daftarMahasiswa.findAll { it.nama.contains("Snake") }.each {
    println it
}

Berbeda dengan anonymous type di C#, sebuah Expando di Groovy tidak terbatas hanya read-only karena Expando pada dasarnya juga sebuah objek yang dapat direferensi oleh variabel lainnya.

Hal lain yang ada di collections C# dan Groovy tetapi tidak dimiliki oleh Java adalah indexer. Sebagai contoh, pada kode program di atas, saya dapat mengakses List dengan kode program C# seperti berikut ini:

Console.WriteLine(daftarMahasiswa[2]);  // mengembalikan item ketiga dari List

Berikutnya, saya akan menggunakan struktur data Dictionary. Berikut ini adalah contoh kode program C# yang memakai Dictionary:

using System.Collections.Generic;
using System;

namespace Latihan
{
    class Program
    {
        static void Main(string[] args)
        {
            var daftarNilai = new Dictionary<string, int>();
            daftarNilai.Add("Solid Snake", 80);
            daftarNilai.Add("Liquid Snake", 90);
            daftarNilai.Add("Big Boss", 100);

            Console.WriteLine("Nilai Solid Snake adalah {0}", daftarNilai["Solid Snake"]);
            Console.ReadKey();
        }
    }
}

atau

using System;
using System.Collections.Generic;

namespace Latihan
{
    class Program
    {
        static void Main(string[] args)
        {
            var daftarNilai = new Dictionary<string, int>()
            {
                { "Solid Snake", 80 },
                { "Liquid Snake", 90 },
                { "Big Boss", 100 }
            };            

            Console.WriteLine("Nilai Solid Snake adalah {0}", daftarNilai["Solid Snake"]);
            Console.ReadKey();
        }
    }
}

Class Dictionary memiliki sifat yang mirip seperti Map di Java. Sebagai contoh, berikut adalah versi Java dari kode program di atas:

package main;

import java.util.HashMap;
import java.util.Map;

public class Program {

    public static void main(String[] args) {
        Map<String, Integer> daftarNilai = new HashMap<>();
        daftarNilai.put("Solid Snake", 80);
        daftarNilai.put("Liquid Snake", 90);
        daftarNilai.put("Big Boss", 100);

        System.out.printf("Nilai Solid Snake adalah %d\n", daftarNilai.get("Solid Snake"));
    }
}

Kode program Java dalam hal ini terlihat lebih kaku dibanding C# karena Java tidak memiliki indexer dan initializer. Tapi bila dibandingkan dengan versi Groovy, say merasa versi Groovy masih lebih nyaman, seperti yang terlihat pada kode program Groovy berikut ini:

def daftarNilai = [
    "Solid Snake": 80,
    "Liquid Snake": 90,
    "BigBoss": 100
]
println "Nilai Solid Snake adalah ${daftarNilai['Solid Snake']}"

Perihal Solid Snake
I'm nothing...

One Response to Memakai Collections Di C#

  1. David Low mengatakan:

    .NET Framework 4 juga memiliki ExpandoObject.

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: