Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Switch-case-Anweisung mit Strings
Lumbra
myCSharp.de - Member

Avatar #avatar-2938.gif


Dabei seit:
Beiträge: 115
Herkunft: Köln

Themenstarter:

Switch-case-Anweisung mit Strings

beantworten | zitieren | melden

Hallo zusammen,

ich hoffe ich habe bei der Suche nichts übersehen, deshalb hier meine Frage:

Ich benutze das untenstehende Codefragment um bestimmte Dateiendungen von einer Operation auszuschließen. Komischerweise interessiert das switch-case die Dateiendung gar nicht! Beim debuggen springt der Aufrufzeiger immer direkt ins default. Hab ich irgendwas übersehen?


FileInfo fi = new FileInfo(_attachmentName);

var test = fi.Extension;
switch (test)
{
    case ".7z":
    case ".zip":
    case ".rar":
    case ".gzip":
        break;
    default:
        CompressAttachment(_compressName, _attachmentName);
        break;
}

Grüße,
Michael
Grüße,
der Michael
private Nachricht | Beiträge des Benutzers
Spook
myCSharp.de - Member



Dabei seit:
Beiträge: 244
Herkunft: Esslingen a.N.

beantworten | zitieren | melden

Hallo Lumbra,

Groß-/Kleinschreibung ggf?

spooky
private Nachricht | Beiträge des Benutzers
Lumbra
myCSharp.de - Member

Avatar #avatar-2938.gif


Dabei seit:
Beiträge: 115
Herkunft: Köln

Themenstarter:

beantworten | zitieren | melden

nee .toLower() hatte ich auch schon probiert...
Grüße,
der Michael
private Nachricht | Beiträge des Benutzers
rollerfreak2
myCSharp.de - Member

Avatar #avatar-3271.jpg


Dabei seit:
Beiträge: 916

beantworten | zitieren | melden

Wenn du im default landest, wie ist denn dann der Wert von deiner var test?
Again what learned...
private Nachricht | Beiträge des Benutzers
user8744
myCSharp.de - Member



Dabei seit:
Beiträge: 1.150

beantworten | zitieren | melden

wie ist denn der name der datei bzw. der dateiendung?
private Nachricht | Beiträge des Benutzers
Lumbra
myCSharp.de - Member

Avatar #avatar-2938.gif


Dabei seit:
Beiträge: 115
Herkunft: Köln

Themenstarter:

beantworten | zitieren | melden

Ich hab es mit test.7z und test.zip probiert.

fi.Extension macht daraus ".7z" und ".zip", was meinen Cases entspricht.

Ich hab auch noch extra in der MSDN geschaut aber da steht es mit den Strings genauso (switch-case)
Grüße,
der Michael
private Nachricht | Beiträge des Benutzers
user8744
myCSharp.de - Member



Dabei seit:
Beiträge: 1.150

beantworten | zitieren | melden

blöde frage, hast du noch in nem übergeordneten scope(klassenfeld oder so)
ne variable namens test? weit her geholt aber eigentlich sollte dein code funktionieren....
private Nachricht | Beiträge des Benutzers
Lumbra
myCSharp.de - Member

Avatar #avatar-2938.gif


Dabei seit:
Beiträge: 115
Herkunft: Köln

Themenstarter:

beantworten | zitieren | melden

Nee, definitiv nicht, aber selbst wenn, der ReSharper hätte mich drauf hingewiesen denke ich...

Wenn ich das ganze als IF-Anweisung umbau, dann gehts übrigens auch nicht!

Da fällt mir was ein: fi.Extension gibt einen Unicode-String zurück - was ist denn "string" selbst?
Grüße,
der Michael
private Nachricht | Beiträge des Benutzers
user8744
myCSharp.de - Member



Dabei seit:
Beiträge: 1.150

beantworten | zitieren | melden

also ich habs bei mir mit "c:\\test.zip" nachgestellt und lande nicht im default.
welche .NET Version verwendest du?
private Nachricht | Beiträge des Benutzers
Spook
myCSharp.de - Member



Dabei seit:
Beiträge: 244
Herkunft: Esslingen a.N.

beantworten | zitieren | melden

Der Code aus dem Startpost funktioniert ohne Probleme.
Wenn du ToLower() schon versucht hast, warum hast du diese (wohl zum funktionieren essentielle Zeile) wieder gelöscht?
private Nachricht | Beiträge des Benutzers
Lumbra
myCSharp.de - Member

Avatar #avatar-2938.gif


Dabei seit:
Beiträge: 115
Herkunft: Köln

Themenstarter:

beantworten | zitieren | melden

.Net 3.5
Visual Studio 2008 Prof. SP1
Grüße,
der Michael
private Nachricht | Beiträge des Benutzers
Lumbra
myCSharp.de - Member

Avatar #avatar-2938.gif


Dabei seit:
Beiträge: 115
Herkunft: Köln

Themenstarter:

beantworten | zitieren | melden

@Spook: Wenn es damit funktionieren würde, hätte ich hier kaum gefragt ;)
Grüße,
der Michael
private Nachricht | Beiträge des Benutzers
Florian Reischl
myCSharp.de - Experte

Avatar #avatar-2880.jpg


Dabei seit:
Beiträge: 1.564
Herkunft: München

beantworten | zitieren | melden

Hi Lumbra

Versteh' mich nicht falsch aber ich würde sagen da passt irgendwas anderes nicht.

Führ' das hier mal aus:



      [Test]
      public void SampleUsage() {
         string[] extensions = new[] { ".zip", ".7z", ".rar", "blubber", "blubb" };

         foreach (var test in extensions) {
            switch (test) {
               case ".7z":
               case ".zip":
               case ".rar": 
               case ".gzip":
                  break;
               default:
                  Debug.WriteLine(test);
                  break;
            }
         }
      }

Grüße
Flo
Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.
private Nachricht | Beiträge des Benutzers
xxMUROxx
myCSharp.de - Member

Avatar #avatar-3236.jpg


Dabei seit:
Beiträge: 1.552
Herkunft: Südtirol/Italien

beantworten | zitieren | melden

Hallo Lumbra,

der einzige Fehler ist dass du höchstwahrscheinlich im Release Mode bist und "Optimize Code" eingestellt hast. Oder du hast dies im Debug Mode explizit gesetzt.
Dabei wird deine switch oder if wegoptimiert, da sie einfach keinen Sinn macht. Um der Optimierung temporär zu umgehen schreib mal folgendes, dann siehst du super dass der Code richtig funktioniert und er in den richtigen switch/if Fall reingeht:


switch (test)
{
    case ".gzip":
    case ".rar":
    case ".zip":
    case ".7z":
        Debugger.Break();
        break;
    default:
        Debugger.Break();
        break;
}

So wird der case Block auch im "Optimize Code" ausgeführt.

@Florian Reischl,
deins funktioniert mit der "Optimize Code" an auch nicht, anderfalls schon.

@Lumbra
Naja, es würde funktionieren, aber der Code macht NIX, desswegen wird er wegoptimiert. Wenn du in den Statements etwas Code rein machst wird auch nichts wegoptimiert.

Kick die Option aber nicht im RELEASE mode weg, sondern nur wenn sie im DEBUG aktiviert ist.

Gruß
Michael
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von xxMUROxx am .
Attachments
Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp
private Nachricht | Beiträge des Benutzers
Lumbra
myCSharp.de - Member

Avatar #avatar-2938.gif


Dabei seit:
Beiträge: 115
Herkunft: Köln

Themenstarter:

beantworten | zitieren | melden

Hmm, die Einstellungen haben nichts gebracht...

Aber ich habe jetzt statt break; return; eingefügt und seltsamerweise gehts nun...

Danke Euch für die Anregungen!!

Grüße,
Michael
Grüße,
der Michael
private Nachricht | Beiträge des Benutzers
xxMUROxx
myCSharp.de - Member

Avatar #avatar-3236.jpg


Dabei seit:
Beiträge: 1.552
Herkunft: Südtirol/Italien

beantworten | zitieren | melden

Ja aber return und break zwei verschiendene Arten eine switch zu beenden. Währen das eine aus der Methode zurückkehrt, bricht die eine nur die switch ab.

Desswegen die Frage, was willst du mit dem Code erreichen. Auf jeden Fall macht er NIX.
Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp
private Nachricht | Beiträge des Benutzers
Spook
myCSharp.de - Member



Dabei seit:
Beiträge: 244
Herkunft: Esslingen a.N.

beantworten | zitieren | melden

Das beschriebene Problem ist doch, dass er immer in den default block springt und nicht, dass er den switch block optimiert.
private Nachricht | Beiträge des Benutzers
Lumbra
myCSharp.de - Member

Avatar #avatar-2938.gif


Dabei seit:
Beiträge: 115
Herkunft: Köln

Themenstarter:

beantworten | zitieren | melden

@xxMUROxx: Das sehe ich aber anders, mein Code macht durchaus etwas, allerdings nur im DEFAULT...

Mit den Cases vorher wollte ich eigentlich "nur" einen Abbruch des Switchs erreichen

Bei mir sieht es jetzt so aus:



FileInfo fi = new FileInfo(_attachmentName);
var test = fi.Extension.ToLower();

switch (test)
{
    case ".7z":
    case ".zip":
    case ".rar":
    case ".gzip":
        return;
    default:
        attachment.SaveAsFile(_attachmentName);
        CompressAttachment(_compressName, _attachmentName);

        _attachmentIndex = attachment.Index;
        
        _mailItem.Attachments.Remove(_attachmentIndex);
        _mailItem.Attachments.Add(_compressName, Type.Missing, Type.Missing, Type.Missing);
        return;
}

Gruß,
Michael
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Lumbra am .
Grüße,
der Michael
private Nachricht | Beiträge des Benutzers
michlG
myCSharp.de - Experte

Avatar #avatar-2909.png


Dabei seit:
Beiträge: 3.430
Herkunft: Naturns - Südtirol - Italien

beantworten | zitieren | melden

Hallo Lumbra,

das was du da machen willst ist nicht wirklich für ein switch geeignet.
Es wird zwar funktionieren ist aber nicht wirklich sinnvoll.

Du kannst das auch einfach mit einer if Anweisung machen.
So z.B.


var extensions = new string[]{".txt", ".png", ".jpg"};
if(!extensions.Contains(fi.Extension.ToLower()))
{
    //das wäre dann das selbe wie dein Default im Switch
}

Gruß
Michael
private Nachricht | Beiträge des Benutzers
Lumbra
myCSharp.de - Member

Avatar #avatar-2938.gif


Dabei seit:
Beiträge: 115
Herkunft: Köln

Themenstarter:

beantworten | zitieren | melden

Hallo michlG,

so in der Art hab ich es jetzt gemacht, wobei Contains() bei strings nicht funktioniert - also habe ich eine List<string> genommen, damit gehts dann wieder...

Danke Euch für Eure Hilfe!!

Gruß,
Michael
Grüße,
der Michael
private Nachricht | Beiträge des Benutzers
rollerfreak2
myCSharp.de - Member

Avatar #avatar-3271.jpg


Dabei seit:
Beiträge: 916

beantworten | zitieren | melden

Zitat
wobei Contains() bei strings nicht funktioniert

Wieso sollte das nicht funktionieren? Es ist zwar wesentlich langsamer aber das hier müsste m.E. nach gehen.


string extensions = ".txt.png.jpg";
if(!extensions.Contains(fi.Extension.ToLower()))
{
    //das wäre dann das selbe wie dein Default im Switch
}
Again what learned...
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15.846

beantworten | zitieren | melden


rollerfreak2, wobei zu erwähnen ist, dass Dein Beispiel nicht "korrekt" ist. Es hätte unangenehme Nebeneffekte. Daher sollte hier auf eine Liste zurück gegriffen werden.
Siehe Beispiel von michlG.
private Nachricht | Beiträge des Benutzers
ujr
myCSharp.de - Experte



Dabei seit:
Beiträge: 1.688

beantworten | zitieren | melden

Abgesehen von anderen, besser funktionierenden, Lösungen stellt sich natürlich immer noch die Frage, warum switch/case nicht funktionieren sollte.
Leider ist Lumbra bisher die Antwort auf die Frage nach dem Inhalt von Extension im default-Zweig schuldig geblieben. Außerdem könnte durch Logging festgestellt werden, ob es einfach nur ein scheinbares Fehlverhalten z. B. aufgrund von Optimierungen war.
private Nachricht | Beiträge des Benutzers