Saya ingin menggunakan sakelar, tetapi saya memiliki banyak kasus, apakah ada jalan pintas? Sejauh ini satu-satunya solusi yang saya tahu dan coba adalah:
switch (number)
{
case 1: something; break;
case 2: other thing; break;
...
case 9: .........; break;
}
Apa yang saya harap dapat saya lakukan adalah seperti:
switch (number)
{
case (1 to 4): do the same for all of them; break;
case (5 to 9): again, same thing for these numbers; break;
}
c#
switch-statement
pengguna3022162
sumber
sumber
Jawaban:
Agak terlambat untuk permainan untuk pertanyaan ini, tetapi dalam perubahan terbaru yang diperkenalkan di C # 7 (Tersedia secara default di Visual Studio 2017 / .NET Framework 4.6.2), pengalihan berbasis jangkauan sekarang dimungkinkan dengan
switch
pernyataan tersebut.Contoh:
int i = 63; switch (i) { case int n when (n >= 100): Console.WriteLine($"I am 100 or above: {n}"); break; case int n when (n < 100 && n >= 50 ): Console.WriteLine($"I am between 99 and 50: {n}"); break; case int n when (n < 50): Console.WriteLine($"I am less than 50: {n}"); break; }
Catatan:
(
dan)
tidak diperlukan dalamwhen
kondisi tersebut, tetapi digunakan dalam contoh ini untuk menyoroti perbandingan.var
juga dapat digunakan sebagai penggantiint
. Sebagai contoh:case var n when n >= 100:
.sumber
(
dan)
sekitarwhen
kondisi tidak diperlukan. Yaitucase int n when n >= 100:
juga bekerja.var
berhasil: Yaitucase var n when n >= 100:
.Berikut adalah solusi yang lebih baik dan elegan untuk pernyataan masalah Anda.
int mynumbercheck = 1000; // Your number to be checked var myswitch = new Dictionary <Func<int,bool>, Action> { { x => x < 10 , () => //Do this!... }, { x => x < 100 , () => //Do this!... }, { x => x < 1000 , () => //Do this!... }, { x => x < 10000 , () => //Do this!... } , { x => x < 100000 , () => //Do this!... }, { x => x < 1000000 , () => //Do this!... } };
Sekarang untuk memanggil sakelar bersyarat kami
Alternatif untuk Switch / ifElse
sumber
Saya akan menggunakan operator terner untuk mengkategorikan kondisi sakelar Anda.
Begitu...
switch( number > 9 ? "High" : number > 5 ? "Mid" : number > 1 ? "Low" : "Floor") { case "High": do the thing; break; case "Mid": do the other thing; break; case "Low": do something else; break; case "Floor": do whatever; break; }
sumber
Untuk melengkapi utas, berikut sintaks dengan C # 8:
var percent = price switch { var n when n >= 1000000 => 7f, var n when n >= 900000 => 7.1f, var n when n >= 800000 => 7.2f, _ => 0f // default value };
Jika Anda ingin menentukan rentangnya:
var percent2 = price switch { var n when n >= 1000000 => 7f, var n when n < 1000000 && n >= 900000 => 7.1f, var n when n < 900000 && n >= 800000 => 7.2f, _ => 0f // default value };
sumber
If-else harus digunakan dalam kasus itu, Tetapi jika masih ada kebutuhan untuk beralih karena alasan apa pun, Anda dapat melakukan seperti di bawah ini, kasus pertama tanpa jeda akan menyebar hingga jeda pertama ditemukan. Seperti yang disarankan oleh jawaban sebelumnya, saya merekomendasikan tombol if-else over.
switch (number){ case 1: case 2: case 3: case 4: //do something; break; case 5: case 6: case 7: case 8: case 9: //Do some other-thing; break; }
sumber
Anda bisa
switch
membuat rentang "pegangan" dengan menggunakannya dalam hubungannya dengan salahList
satu batas Anda.List<int> bounds = new List<int>() {int.MinValue, 0, 4, 9, 17, 20, int.MaxValue }; switch (bounds.IndexOf(bounds.Last(x => x < j))) { case 0: // <=0 break; case 1: // >= 1 and <=4 break; case 2: // >= 5 and <=9 break; case 3: // >= 10 and <=17 break; case 4: // >= 18 and <=20 break; case 5: // >20 break; }
Dengan pendekatan ini, rentang dapat memiliki rentang yang berbeda.
sumber
Interval konstan:
int range = 5 int newNumber = number / range; switch (newNumber) { case (0): //number 0 to 4 break; case (1): //number 5 to 9 break; case (2): //number 10 to 14 break; default: break; }
Jika tidak:
if else
sumber
Seperti yang disebutkan
if-else
akan lebih baik dalam kasus ini, di mana Anda akan menangani berbagai:if(number >= 1 && number <= 4) { //do something; } else if(number >= 5 && number <= 9) { //do something else; }
sumber
Dalam. Net hanya Visual Basic memungkinkan rentang dalam pernyataan switch, tetapi dalam C # tidak ada sintaks yang valid untuk ini.
Mengatasi masalah spesifik Anda di C #, saya akan menyelesaikannya sebagai berikut:
if(number >= 1 && number <= 9) // Guard statement { if(number < 5) { // Case (1 to 4): //break; } else { // Case (5 to 9): //break; } } else { // Default code goes here //break; }
Untuk mengilustrasikan hal ini lebih lanjut, bayangkan Anda memiliki nilai persentase.
Menggunakan masalah Anda sebagai template, Anda mungkin ingin ini terlihat seperti:
switch (percentage) { case (0 to 19): break; case (20 to 39): break; case (40 to 69): break; case (70 to 79): break; case (80 to 100): break; default: break; }
Namun, karena C # tidak mengizinkan sintaks itu, berikut adalah solusi yang diizinkan C #:
if (percentage >= 0 && percentage <= 100) // Guard statement { if (percentage >= 40) { if (percentage >= 80) { // Case (80% to 100%) //break; } else { if (percentage >= 70) { // Case (70% to 79%) //break; } else { // Case (40% to 69%) //break; } } } else { if (percentage >= 20) { // Case (20% to 39%) //break; } else { // Case (0% to 19%) //break; } } } else { // Default code goes here //break; }
Mungkin perlu sedikit waktu untuk membiasakan diri, tetapi tidak apa-apa setelah Anda memahaminya.
Secara pribadi, saya akan menyambut pernyataan switch untuk memungkinkan rentang.
Masa depan pernyataan saklar C #
Berikut beberapa gagasan yang saya miliki tentang bagaimana pernyataan sakelar dapat ditingkatkan:
Versi A
switch(value) { case (x => x >= 1 && x <= 4): break; case (x => x >= 5 && x <= 9): break; default: break; }
Versi B
switch(param1, param2, ...) { case (param1 >= 1 && param1 <= 4): break; case (param1 >= 5 && param1 <= 9 || param2 != param1): break; default: break; }
sumber
Jika Anda menggunakan C / C ++, tidak ada sintaks "range". Anda hanya dapat mencantumkan semua nilai setelah setiap segmen "kasus". Bahasa Ada atau sintaks rentang dukungan Pascal.
sumber
Pertama-tama, Anda harus menentukan bahasa pemrograman yang Anda maksud. Kedua,
switch
pernyataan digunakan dengan benar untuk kumpulan opsi tertutup terkait variabel yang dialihkan, misalnya enumerasi atau string yang telah ditentukan sebelumnya. Untuk kasus ini, saya sarankan menggunakanif-else
struktur lama yang baik .sumber
Tidak mungkin melalui
switch
kasus. Anda bisa menggunakan pernyataan if bersarang.if(number>=1 && number<=4){ //Do something }else if(number>=5 && number<=9){ //Do something }
sumber
(number >= 1 && number <= 4)
daripada memeriksa setiap nomor? Bagaimana Anda akan menulis antara 1 dan 120 ? ;-)=
vs==
.Jika pertanyaannya tentang C (Anda tidak mengatakannya), maka jawabannya tidak, tetapi : GCC dan Clang (mungkin yang lain) mendukung sintaks rentang , tetapi itu bukan ISO C yang valid:
switch (number) { case 1 ... 4: // Do something. break; case 5 ... 9: // Do something else. break; }
Pastikan untuk memiliki spasi sebelum dan sesudah
...
atau Anda akan mendapatkan kesalahan sintaks.sumber
Dalam kasus C # switch pada dasarnya kamus tentang apa yang harus dilakukan selanjutnya. Karena Anda tidak dapat mencari rentang dalam kamus, hal terbaik yang dapat Anda lakukan adalah kasus ... ketika pernyataan Steve Gomez disebutkan.
sumber
Anda bisa menggunakan pernyataan if-else dengan || operator (atau operator) seperti:
if(case1 == true || case2 == true || case3 == true) { Do this!... } else if(case4 == true || case5 == true || case6 == true) { Do this!... } else if(case7 == true || case8 == true || case9 == true) { Do this!... }
sumber
if (number >= 1 && number <= 4) { … } else if (number >= 5 && number <= 9) { … }
, bukan begitu?