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 #
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:
Ordinal : Bebek, angsa, ayam
id-ID : angsa, ayam, BebekMari kita bedah kedua hasil:
- Ordinal: pembanding membaca angka Unicode; huruf kapital
B(66) lebih kecil daria(97), sehinggaBebekmelompat ke depan dan urutan terasa tidak alami bagi manusia. - id-ID dengan
ignoreCase: true: argumen kedua membuat pembanding mengabaikan perbedaan huruf besar-kecil, sehinggaangsadanayamdinilai sebelumBebekberdasarkan urutan abjad yang dirasakan pembaca Indonesia. - 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.