Mengurutkan kata tidak sekadar membandingkan huruf. Setiap culture menyimpan aturan urutan abjadnya sendiri, dan aturan itu disebut collation. .NET menawarkan dua keluarga pembanding (comparer): StringComparer.Ordinal yang membandingkan kode Unicode karakter satu per satu, dan StringComparer.Create(culture) yang memakai CompareInfo milik culture. Keduanya menghasilkan urutan yang berbeda pada daftar yang sama.

Dua Comparer pada Daftar Sama #

csharp
var kata = new List<string> { "ayam", "Bebek", "angsa" };

kata.Sort(StringComparer.Ordinal);
Console.WriteLine("Ordinal : " + string.Join(", ", kata));

var pembanding = StringComparer.Create(CultureInfo.GetCultureInfo("id-ID"), true);
kata.Sort(pembanding);
Console.WriteLine("id-ID   : " + string.Join(", ", kata));

Output yang Dihasilkan:

text
Ordinal : Bebek, angsa, ayam
id-ID   : angsa, ayam, Bebek

Mari kita bedah kedua hasil:

  1. Ordinal: pembanding membaca angka Unicode; huruf kapital B (66) lebih kecil dari a (97), sehingga Bebek melompat ke depan dan urutan terasa tidak alami bagi manusia.
  2. id-ID dengan ignoreCase: true: argumen kedua membuat pembanding mengabaikan perbedaan huruf besar-kecil, sehingga angsa dan ayam dinilai sebelum Bebek berdasarkan urutan abjad yang dirasakan pembaca Indonesia.
  3. Stabilitas keputusan: perbedaan ini bukan bug, melainkan dua definisi urutan yang sah; masalah muncul ketika satu sistem menyimpan dengan comparer tertentu dan sistem lain membaca dengan comparer berbeda.

Collation juga menangani detail kecil yang terasa besar bagi pembaca: kata berawalan tanda hubung, angka di dalam teks, dan karakter beraksen diurutkan sesuai aturan culture. Karena aturan tersebut dapat berubah antar versi data ICU, urutan yang disimpan ke database jangan dianggap permanen; simpan kunci urutan eksplisit bila kestabilan urutan menjadi syarat bisnis, dan biarkan comparer culture hanya untuk penampilan.