Apakah ada cara untuk jatuh melalui beberapa laporan kasus tanpa menyatakan kasus nilai:
berulang-ulang?
Aku tahu ini bekerja:
switch (value)
{
case 1:
case 2:
case 3:
//do some stuff
break;
case 4:
case 5:
case 6:
//do some different stuff
break;
default:
//default stuff
break;
}
tapi aku'a ingin melakukan sesuatu seperti ini:
switch (value)
{
case 1,2,3:
//Do Something
break;
case 4,5,6:
//Do Something
break;
default:
//Do the Default
break;
}
Sintaks ini saya'm memikirkan dari bahasa yang berbeda, atau aku kehilangan sesuatu?
Saya kira ini sudah dijawab. Namun, saya berpikir bahwa anda masih dapat mencampur kedua pilihan dalam sintaksis cara yang lebih baik dengan melakukan:
switch (value)
{
case 1: case 2: case 3:
// Do Something
break;
case 4: case 5: case 6:
// Do Something
break;
default:
// Do Something
break;
}
Sintaks ini adalah dari Visual Basic Pilih Kasus...Statement:
Dim number As Integer = 8
Select Case number
Case 1 To 5
Debug.WriteLine("Between 1 and 5, inclusive")
' The following is the only Case clause that evaluates to True.
Case 6, 7, 8
Debug.WriteLine("Between 6 and 8, inclusive")
Case Is < 1
Debug.WriteLine("Equal to 9 or 10")
Case Else
Debug.WriteLine("Not between 1 and 10, inclusive")
End Select
Anda tidak dapat menggunakan sintaks ini di C#. Sebaliknya, anda harus menggunakan sintaks dari contoh pertama.
Sedikit terlambat untuk pertanyaan awal, tapi saya'm postingan ini menjawab dengan harapan bahwa seseorang menggunakan versi yang lebih baru (C# 7 -- tersedia secara default di Visual Studio 2017/.NET Framework 4.6.2), akan menemukan itu berguna.
Dalam C# 7, kisaran berbasis switching sekarang mungkin dengan pernyataan dan akan membantu dengan OP's masalah.
Contoh:
int i = 5;
switch (i)
{
case int n when (n >= 7):
Console.WriteLine($"I am 7 or above: {n}");
break;
case int n when (n >= 4 && n <= 6 ):
Console.WriteLine($"I am between 4 and 6: {n}");
break;
case int n when (n <= 3):
Console.WriteLine($"I am 3 or less: {n}");
break;
}
// Output: I am between 4 and 6: 5
Catatan:
(
dan )
tidak diperlukan dalam ketika
kondisi, tetapi digunakan dalam contoh ini untuk menyoroti perbandingan(s). var
juga dapat digunakan sebagai pengganti int
. Misalnya: kasus var n bila n >= 7:
.Anda dapat meninggalkan newline yang memberikan anda:
case 1: case 2: case 3:
break;
tetapi saya menganggap bahwa gaya yang buruk.
.NET Framework 3.5 telah mendapat berkisar:
anda dapat menggunakannya dengan "berisi" dan JIKA pernyataan, karena seperti seseorang mengatakan pernyataan SWITCH menggunakan "==" operator.
Berikut ini sebuah contoh:
int c = 2;
if(Enumerable.Range(0,10).Contains(c))
DoThing();
else if(Enumerable.Range(11,20).Contains(c))
DoAnotherThing();
Tapi saya pikir kita bisa memiliki lebih menyenangkan: karena anda tidak't perlu kembali nilai-nilai dan tindakan ini doesn't mengambil parameter, anda dapat dengan mudah menggunakan tindakan!
public static void MySwitchWithEnumerable(int switchcase, int startNumber, int endNumber, Action action)
{
if(Enumerable.Range(startNumber, endNumber).Contains(switchcase))
action();
}
Tua misalnya dengan metode baru ini:
MySwitchWithEnumerable(c, 0, 10, DoThing);
MySwitchWithEnumerable(c, 10, 20, DoAnotherThing);
Sejak kau lewat tindakan, bukan nilai-nilai, anda harus menghilangkan tanda kurung, it's sangat penting. Jika anda membutuhkan fungsi dengan argumen, hanya mengubah jenis Action
untuk Action<ParameterType>
. Jika anda perlu kembali nilai-nilai, menggunakan Func<ParameterType, ReturnType>
.
Pada C# 3.0 tidak mudah Parsial Aplikasi untuk merangkum fakta kasus parameter yang sama, tapi anda membuat sedikit metode penolong (sedikit verbose, tho).
public static void MySwitchWithEnumerable(int startNumber, int endNumber, Action action){
MySwitchWithEnumerable(3, startNumber, endNumber, action);
}
Berikut ini contoh bagaimana fungsional baru yang diimpor pernyataan IMHO lebih kuat dan elegan dari yang lama penting satu.
Berikut adalah lengkap C#7 solusi...
switch (value)
{
case var s when new[] { 1,2,3 }.Contains(s):
//Do Something
break;
case var s when new[] { 4,5,6 }.Contains(s):
//Do Something
break;
default:
//Do the Default
break;
}
Bekerja dengan string terlalu...
switch (mystring)
{
case var s when new[] { "Alpha","Beta","Gamma" }.Contains(s):
//Do Something
break;
...
}
@ Jennifer Owens: anda benar kode di bawah ini tidak't bekerja:
case 1 | 3 | 5:
//not working do something
Satu-satunya cara untuk melakukan ini adalah:
case 1: case 2: case 3:
// do something
break;
Kode anda mencari untuk bekerja pada visual basic, dimana anda dengan mudah dapat menempatkan berkisar... di tidak ada pilihan untuk beralih atau jika lain blok, nyaman, saya'd sarankan untuk, pada titik ekstrim, membuat .dll dengan visual basic dan impor kembali ke c# proyek.
Catatan: beralih setara dalam visual basic select case.
Pilihan lain akan menggunakan rutin. Jika kasus 1-3 semua mengeksekusi logika yang sama kemudian bungkus bahwa logika dalam rutinitas dan panggilan untuk masing-masing kasus. Aku tahu ini doesn't benar-benar menyingkirkan laporan kasus, tetapi tidak menerapkan gaya yang baik dan menjaga pemeliharaan minimum.....
[Edit] Menambahkan alternatif implementasi untuk mencocokkan pertanyaan awal...[/Edit]
switch (x)
{
case 1:
DoSomething();
break;
case 2:
DoSomething();
break;
case 3:
DoSomething();
break;
...
}
private void DoSomething()
{
...
}
Alt
switch (x)
{
case 1:
case 2:
case 3:
DoSomething();
break;
...
}
private void DoSomething()
{
...
}
Satu yang kurang dikenal segi saklar dalam C# adalah bahwa hal itu bergantung pada operator= dan karena itu dapat diganti, anda bisa memiliki sesuatu seperti ini:
string s = foo();
saklar (s) {
kasus "abc": /.../ break;
kasus "def": /.../ break;
}
gcc mengimplementasikan sebuah ekstensi untuk bahasa C untuk mendukung berurutan berkisar:
switch (value)
{
case 1...3:
//Do Something
break;
case 4...6:
//Do Something
break;
default:
//Do the Default
break;
}
Edit: Hanya melihat C# tag pada pertanyaan, jadi mungkin gcc jawaban doesn't membantu.
Sebenarnya saya don't seperti perintah GOTO juga, tapi itu's resmi MS bahan, berikut adalah semua diperbolehkan sintaks.
Jika titik akhir dari pernyataan daftar yang beralih bagian yang sangat terjangkau, compile-time error terjadi. Hal ini dikenal sebagai "tidak ada yang jatuh melalui" aturan. Contoh
switch (i) {
case 0:
CaseZero();
break;
case 1:
CaseOne();
break;
default:
CaseOthers();
break;
}
ini berlaku karena tidak ada saklar bagian yang telah dicapai titik akhir. Tidak seperti C dan C++, pelaksanaan beralih bagian tidak diizinkan untuk "gagal" untuk selanjutnya beralih bagian, dan contoh
switch (i) {
case 0:
CaseZero();
case 1:
CaseZeroOrOne();
default:
CaseAny();
}
hasil compile-time error. Ketika eksekusi dari sebuah saklar bagian harus diikuti oleh pelaksanaan yang lain beralih bagian, eksplisit goto kasus atau goto default pernyataan yang harus digunakan:
switch (i) {
case 0:
CaseZero();
goto case 1;
case 1:
CaseZeroOrOne();
goto default;
default:
CaseAny();
break;
}
Beberapa label yang diizinkan di switch-bagian. Contoh
switch (i) {
case 0:
CaseZero();
break;
case 1:
CaseOne();
break;
case 2:
default:
CaseTwo();
break;
}
Saya percaya dalam kasus ini, GOTO dapat digunakan, it's benar-benar satu-satunya cara untuk fallthrough.
sumber: http://msdn.microsoft.com/en-us/library/aa664749%28v=vs.71%29.aspx
Banyak sekali pekerjaan yang tampaknya telah dimasukkan ke menemukan cara untuk mendapatkan salah satu dari C# paling sedikit digunakan sintaks untuk entah bagaimana terlihat baik atau bekerja lebih baik. Secara pribadi saya menemukan pernyataan switch jarang layak menggunakan. Saya akan sangat menyarankan menganalisis data apa yang anda pengujian dan hasil akhir yang anda ingin.
Mari kita katakan misalnya anda ingin cepat menguji nilai-nilai yang diketahui range untuk melihat jika mereka adalah bilangan prima. Anda ingin menghindari memiliki kode anda jangan boros perhitungan dan anda dapat menemukan daftar bilangan prima dalam kisaran yang anda inginkan secara online. Anda bisa menggunakan sejumlah besar pernyataan switch untuk membandingkan masing-masing nilai untuk diketahui bilangan prima.
Atau anda hanya bisa membuat array peta bilangan prima dan mendapatkan hasil yang langsung:
bool[] Primes = new bool[] {
false, false, true, true, false, true, false,
true, false, false, false, true, false, true,
false,false,false,true,false,true,false};
private void button1_Click(object sender, EventArgs e) {
int Value = Convert.ToInt32(textBox1.Text);
if ((Value >= 0) && (Value < Primes.Length)) {
bool IsPrime = Primes[Value];
textBox2.Text = IsPrime.ToString();
}
}
Mungkin anda ingin melihat jika sebuah karakter dalam string heksadesimal. Anda bisa menggunakan ungly dan agak besar pernyataan switch.
Atau anda bisa menggunakan ekspresi reguler untuk menguji char atau gunakan IndexOf fungsi untuk mencari karakter dalam string yang dikenal heksadesimal huruf:
private void textBox2_TextChanged(object sender, EventArgs e) {
try {
textBox1.Text = ("0123456789ABCDEFGabcdefg".IndexOf(textBox2.Text[0]) >= 0).ToString();
} catch {
}
}
Mari kita katakan anda ingin melakukan salah satu dari 3 tindakan yang berbeda tergantung pada nilai yang akan berkisar dari 1 sampai 24. Saya akan menyarankan menggunakan satu set pernyataan IF. Dan jika itu menjadi terlalu kompleks (Atau angka-angka yang lebih besar seperti 5 tindakan yang berbeda tergantung pada nilai di kisaran 1 90) maka penggunaan enum untuk menentukan tindakan dan membuat array peta enums. Nilai tersebut kemudian akan digunakan untuk indeks ke array peta dan mendapatkan enum dari tindakan yang anda inginkan. Kemudian gunakan salah satu set kecil JIKA pernyataan atau sangat sederhana pernyataan switch untuk proses yang dihasilkan enum nilai.
Juga, hal yang baik tentang array peta yang mengubah rentang nilai menjadi tindakan adalah bahwa hal itu dapat dengan mudah diubah oleh kode. Dengan kabel keras kode yang anda dapat't dengan mudah mengubah perilaku pada saat runtime tapi dengan array peta sangat mudah.
Jika anda memiliki jumlah yang sangat besar dari string (atau jenis lain) Kasus semua melakukan hal yang sama, saya roadmap penggunaan string Daftar dikombinasikan dengan string.Berisi properti.
Jadi jika anda memiliki besar beralih pernyataan seperti:
switch (stringValue)
{
case "cat":
case "dog":
case "string3":
...
case "+1000 more string": //Too many string to write a case for all!
//Do something;
case "a lonely case"
//Do something else;
.
.
.
}
Anda mungkin ingin menggantinya dengan jika pernyataan seperti ini:
//Define all the similar "case" string in a List
List<string> listString = new List<string>(){ "cat", "dog", "string3", "+1000 more string"};
//Use string.Contains to find what you are looking for
if (listString.Contains(stringValue))
{
//Do something;
}
else
{
//Then go back to a switch statement inside the else for the remaining cases if you really need to
}
Skala ini baik untuk setiap jumlah string kasus.
Dalam C# 7 sekarang kita memiliki Pencocokan Pola sehingga anda dapat melakukan sesuatu seperti:
csharp switch (usia) { kasus 50: ageBlock = "the big five-oh"; break; kasus var testAge ketika (baru Daftar<int>() { 80, 81, 82, 83, 84, 85, 86, 87, 88, 89 }).Berisi(testAge): ageBlock = "suharto"; break; kasus var testAge ketika ((testAge >= 90) & (testAge <= 99)): ageBlock = "nonagenarian"; break; kasus var testAge ketika (testAge >= 100): ageBlock = "centenarian"; break; default: ageBlock = "tua"; break; }
Hanya untuk menambahkan anda ke percakapan, menggunakan .NET 4.6.2 saya juga bisa melakukan hal berikut. Aku diuji kode dan itu bekerja bagi saya.
Anda juga dapat melakukan beberapa "ATAU" pernyataan, seperti di bawah ini:
switch (value)
{
case string a when a.Contains("text1"):
// Do Something
break;
case string b when b.Contains("text3") || b.Contains("text4") || b.Contains("text5"):
// Do Something else
break;
default:
// Or do this by default
break;
}
Anda juga bisa memeriksa apakah itu sesuai dengan nilai dalam array:
string[] statuses = { "text3", "text4", "text5"};
switch (value)
{
case string a when a.Contains("text1"):
// Do Something
break;
case string b when statuses.Contains(value):
// Do Something else
break;
default:
// Or do this by default
break;
}
Untuk ini, anda akan menggunakan pernyataan goto. Seperti:
switch(value){
case 1:
goto case 3;
case 2:
goto case 3;
case 3:
DoCase123();
//This would work too, but I'm not sure if it's slower
case 4:
goto case 5;
case 5:
goto case 6;
case 6:
goto case 7;
case 7:
DoCase4567();
}