puj@labs

547 views

Sorting in C#

Again, ini sebuah kasus sederhana. Yaitu Sorting. Setelah pada post sebelumnya sempat dikemukakan bagaimana melakukan proses pencarian pada List menggunakan built-in method maka kali ini ingin sedikit menyinggung masalah sorting pada IEnumerable<T>. Ada banyak algoritma sort. Tapi untuk kasus sederhana, yang kita tidak begitu mementingkan O(n) dari suatu operasi maka cara apapun boleh digunakan :D .

Untuk menyamakan suhu, anggaplah kita memiliki kelas Player sebagai berikut :

public String IdPlayer { get; set; }

public String IdTeam { get; set; }

public Position Type {get;set;}

public int Goal { get; set; }

public int ShootWide { get; set; }

public int ShootOnGoal { get; set; }

public int Assist { get; set; }

public int Steal { get; set; }

public int Pass { get; set; }

Nah, sekarang kita memiliki List<Players> dimana kita ingin mengurutkan isi dari List tersebut sesuai dengan parameter yang dijadikan pembanding. Biasanya, jika baru menggunakan C# seringkali tidak sadar terdapat method Sort() yang dapat digunakan untuk keperluan ini. Saya pun sebelumnya sering mengimplementasi ulang algoritma sort yang dipelajari di kuliah algoritma pemrograman untuk melakukan sorting. Itu adalah opsi pertama.

Opsi kedua, gunakan fungsi Sort pada IEnumerable. Biasanya kita memerlukan predicate sebagai masukan fungsi Sort tersebut. Misalkan kita mau mengurutkan berdasarkan jumlah Pass yang dimiliki player, maka yang pertama adalah buat Predicate untuk membandingkan nilai Pass tersebut.

private static int CompareStatisticByPass(PlayerStatistic one, PlayerStatistic two)

        {

            return one.Pass.CompareTo(two.Pass);

        }

Lalu gunakan dalam list.

listPlayer.Sort(CompareStatisticByPass);

Maka secara otomatis, list akan disorting menggunakan Comparer yang telah kita definisikan.

Berikutnya, opsi yang kita miliki adalah menggunakan LINQ. LINQ dapat diterapkan pada objek yang implement IEnumerable<T>. Penggunaan LINQ membuat model pemrograman seperti sintaks yang kita gunakan untuk retrieve data dari sql dan mengurutkannya. Maka contoh nya untuk kasus diatas adalah :

List<PlayerStatistic> listPass = (from ps in listPlayer

                              orderby ps.Pass descending

                              select ps).ToList();

Untuk mempersingkat penulisan , C# sudah mendukung lambda expression sehingga kode diatas juga dapat kita implementasikan menjadi :

List<PlayerStatistic> listPass = listPlayer.OrderByDescending(ps => ps.Pass)

Jika dibandingkan dengan menggunakan Sort yg built-in pada List , pada opsi 3 dan 4 kita tidak memerlukan deklarasi predicate sebagai comparer pada fungsi Sort. Cukup memilih property apa yang ingin dijadikan pembanding. Lebih mudah digunakan dan lebih sedikit kode yang perlu ditulis. Lebih produktif.

Untuk melakukan sort yang multiple condition pun bisa menggunakan sintaks diatas, contohnya :

List<PlayerStatistic> listShoot =( listPlayer.OrderByDescending(

                ps => ps.ShootOnGoal).

                ThenByDescending(ps => ps.ShootWide)).ToList();


Gunakan OrderBy lalu disambung dengan ThenBy, properti-properti yang dijadikan pembanding.

Leave a Reply