Laden...

Switch-case-Anweisung mit Strings

Erstellt von Lumbra vor 12 Jahren Letzter Beitrag vor 12 Jahren 3.234 Views
Lumbra Themenstarter:in
115 Beiträge seit 2008
vor 12 Jahren
Switch-case-Anweisung mit Strings

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

S
248 Beiträge seit 2008
vor 12 Jahren

Hallo Lumbra,

Groß-/Kleinschreibung ggf?

spooky

Lumbra Themenstarter:in
115 Beiträge seit 2008
vor 12 Jahren

nee .toLower() hatte ich auch schon probiert... 🤔

Grüße,
der Michael

916 Beiträge seit 2008
vor 12 Jahren

Wenn du im default landest, wie ist denn dann der Wert von deiner var test?

Again what learned...

Gelöschter Account
vor 12 Jahren

wie ist denn der name der datei bzw. der dateiendung?

Lumbra Themenstarter:in
115 Beiträge seit 2008
vor 12 Jahren

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

Gelöschter Account
vor 12 Jahren

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....

Lumbra Themenstarter:in
115 Beiträge seit 2008
vor 12 Jahren

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

Gelöschter Account
vor 12 Jahren

also ich habs bei mir mit "c:\test.zip" nachgestellt und lande nicht im default.
welche .NET Version verwendest du?

S
248 Beiträge seit 2008
vor 12 Jahren

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?

Lumbra Themenstarter:in
115 Beiträge seit 2008
vor 12 Jahren

.Net 3.5
Visual Studio 2008 Prof. SP1

Grüße,
der Michael

Lumbra Themenstarter:in
115 Beiträge seit 2008
vor 12 Jahren

@Spook: Wenn es damit funktionieren würde, hätte ich hier kaum gefragt 😉

Grüße,
der Michael

1.564 Beiträge seit 2007
vor 12 Jahren

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ß.

1.552 Beiträge seit 2010
vor 12 Jahren

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

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

Lumbra Themenstarter:in
115 Beiträge seit 2008
vor 12 Jahren

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

1.552 Beiträge seit 2010
vor 12 Jahren

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

S
248 Beiträge seit 2008
vor 12 Jahren

Das beschriebene Problem ist doch, dass er immer in den default block springt und nicht, dass er den switch block optimiert.

Lumbra Themenstarter:in
115 Beiträge seit 2008
vor 12 Jahren

@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

Grüße,
der Michael

3.430 Beiträge seit 2007
vor 12 Jahren

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

Lumbra Themenstarter:in
115 Beiträge seit 2008
vor 12 Jahren

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

916 Beiträge seit 2008
vor 12 Jahren

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...

16.806 Beiträge seit 2008
vor 12 Jahren

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.

U
1.688 Beiträge seit 2007
vor 12 Jahren

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.