Seperti yang Anda ketahui, menurunkan dua string dan membandingkannya tidak sama dengan melakukan perbandingan kasus pengabaian. Ada banyak alasan untuk ini. Misalnya, standar Unicode memungkinkan teks dengan diakritik dikodekan dengan berbagai cara. Beberapa karakter menyertakan karakter dasar dan diakritik dalam satu titik kode. Karakter ini juga dapat direpresentasikan sebagai karakter dasar yang diikuti oleh karakter diakritik gabungan. Kedua representasi ini sama untuk semua tujuan, dan perbandingan string yang sadar budaya dalam .NET Framework akan mengidentifikasi mereka dengan benar sebagai sama, baik dengan CurrentCulture atau InvariantCulture (dengan atau tanpa IgnoreCase). Sebaliknya, perbandingan ordinal akan secara keliru menganggapnya tidak setara.
Sayangnya, switch
tidak melakukan apa pun kecuali perbandingan ordinal. Perbandingan ordinal baik-baik saja untuk jenis aplikasi tertentu, seperti mem-parsing file ASCII dengan kode yang ditentukan secara kaku, tetapi perbandingan string ordinal salah untuk sebagian besar kegunaan lain.
Apa yang telah saya lakukan di masa lalu untuk mendapatkan perilaku yang benar hanyalah tiruan pernyataan sakelar saya sendiri. Ada banyak cara untuk melakukannya. Salah satu caranya adalah dengan membuat List<T>
sepasang string kasus dan delegasi. Daftar tersebut dapat dicari dengan menggunakan perbandingan string yang tepat. Ketika kecocokan ditemukan maka delegasi terkait dapat dipanggil.
Pilihan lainnya adalah melakukan rangkaian if
pernyataan yang jelas . Ini biasanya ternyata tidak seburuk kedengarannya, karena strukturnya sangat teratur.
Hal yang hebat tentang ini adalah bahwa sebenarnya tidak ada penalti kinerja dalam meniru fungsi sakelar Anda sendiri saat membandingkan dengan string. Sistem tidak akan membuat tabel lompat O (1) seperti yang dapat dilakukan dengan bilangan bulat, jadi sistem akan membandingkan setiap string satu per satu.
Jika ada banyak kasus untuk dibandingkan, dan kinerja menjadi masalah, maka List<T>
opsi yang dijelaskan di atas dapat diganti dengan kamus yang diurutkan atau tabel hash. Kemudian kinerja berpotensi cocok atau melebihi opsi pernyataan sakelar.
Berikut adalah contoh daftar delegasi:
delegate void CustomSwitchDestination();
List<KeyValuePair<string, CustomSwitchDestination>> customSwitchList;
CustomSwitchDestination defaultSwitchDestination = new CustomSwitchDestination(NoMatchFound);
void CustomSwitch(string value)
{
foreach (var switchOption in customSwitchList)
if (switchOption.Key.Equals(value, StringComparison.InvariantCultureIgnoreCase))
{
switchOption.Value.Invoke();
return;
}
defaultSwitchDestination.Invoke();
}
Tentu saja, Anda mungkin ingin menambahkan beberapa parameter standar dan mungkin tipe pengembalian ke delegasi CustomSwitchDestination. Dan Anda pasti ingin membuat nama yang lebih baik!
Jika perilaku setiap kasus Anda tidak setuju untuk mendelegasikan pemanggilan dengan cara ini, seperti jika parameter differnt diperlukan, maka Anda terjebak dengan if
pernyataan yang dirantai . Saya juga melakukan ini beberapa kali.
if (s.Equals("house", StringComparison.InvariantCultureIgnoreCase))
{
s = "window";
}
else if (s.Equals("business", StringComparison.InvariantCultureIgnoreCase))
{
s = "really big window";
}
else if (s.Equals("school", StringComparison.InvariantCultureIgnoreCase))
{
s = "broken window";
}
ToUpperInvariant()
atauToLowerInvariant()
? Juga, dia tidak membandingkan dua string yang tidak diketahui , dia membandingkan satu string yang tidak diketahui dengan satu string yang dikenal. Jadi, selama dia tahu cara membuat kode keras untuk representasi huruf besar atau kecil yang sesuai maka blok sakelar harus berfungsi dengan baik.