Entwickler-Ecke

C# - Die Sprache - Case Bereichsangabe


Mysterio08 - Sa 02.10.10 13:00
Titel: Case Bereichsangabe
Hallo,

ich habe eine Frage zur Case-Anweisung: Ist es möglich, auch ganze (Integer-)Bereiche prüfen zu lassen? In Delphi wäre das also äquivalent zu "1..5".
Wenn es so etwas nicht gibt: Wie würdet ihr solche Prüfungen vornehmen? Mit if-else (die einzige Alternative, die mir einfällt)?! Da ist dann aber wieder der Nachteil, dass es bei vielen (Bereichs-)Prüfungen sehr unübersichtlich wird.

mfg.


jaenicke - Sa 02.10.10 13:50

Du kannst nur schauen, ob du die Bereiche mathematisch erfassen kannst und auf wenige Werte reduzieren kannst.

Eine andere Möglichkeit gibt es in C# nicht, da musst du schon if..else benutzen.

Je nach Anwendungszweck und Zahlenbereichen kann es aber andere Tricks bzw. Möglichkeiten geben.


Delete - Sa 02.10.10 15:46

Also in C lässt man einfach das break am Ende weg. Jetzt ist mir aber die C#-case-Syntax nicht geläufig, deswegen kann ich nicht sagen, ob es da auch so geht.


jaenicke - Sa 02.10.10 15:49

Ja, das geht genauso, aber man muss ja trotzdem die einzelnen Werte angeben.


Mysterio08 - So 03.10.10 08:42

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Du kannst nur schauen, ob du die Bereiche mathematisch erfassen kannst und auf wenige Werte reduzieren kannst.


Ich bin auf diese Bereichsfrage erst gekommen, als ich eine ganz einfache Aufgabe lösen wollte: in ein Edit wird eine Zahl zwischen 1 und 15 eingegeben und ausgegeben wird die Note - wie man es von der Oberstufe kennt.
Wie würdest du da solch einen mathematischen Bereich erfassen bzw. mit welchem Trick (nur damit ich mal eine Vorstellung habe).


jaenicke - So 03.10.10 09:18

Nun, dort macht eine komplette Switch-Abfrage kaum Sinn, da man die Note auch direkt berechnen kann. Bereiche gibt es da für + oder - als Zusatz, das kann man mit modulo zusammenfassen. Hier mal zwei Lösungswege, ein kurzer und einer mit switch. :mrgreen:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
        private void button1_Click(object sender, EventArgs e)
        {
            int Mark = 0;
            if (Int32.TryParse(textBox1.Text, out Mark))
                label1.Text = new string[] { "6""5-""5""5+""4-""4""4+""3-"
                    "3""3+""2-""2""2+""1-""1""1+" }[Mark];
        }

        private void button2_Click(object sender, EventArgs e)
        {
            int Mark = 0;
            if (Int32.TryParse(textBox2.Text, out Mark)) {
                int NewMark = 6 - (Int32)Math.Ceiling(Mark / 3.0);
                String MarkString = NewMark.ToString();
                switch (Mark % 3)
                {
                    case 0:
                        if (Mark != 0)
                            MarkString = MarkString + '+';
                        break;
                    case 1:
                        MarkString = MarkString + '-';
                        break;
                }
                label2.Text = MarkString;
            }
        }
Ach ja, für die Zahlen 1-15 als Bereich könntest du modulo 15 benutzen, wenn du schauen willst ob eine Zahl in diesem Bereich ist.