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
OpenFileDialog - dynamischer Filter
Pico1184
myCSharp.de - Member

Avatar #avatar-2893.jpg


Dabei seit:
Beiträge: 223
Herkunft: Karlsruhe

Themenstarter:

OpenFileDialog - dynamischer Filter

beantworten | zitieren | melden

Hallo,

ich baue mir aktuell für einen OpenFileDialog einen dynamischen Filter string über eine switch Anweisung.
Der Filter ist ja folgendermaßen aufgebaut: Text files (*.txt)|*.txt|All files (*.*)|*.*

Ich bekomme eine List<string> args mit z.B. *.xml und *.txt

Nun, die Lösung finde ich semi optimal da ich mit der switch Anweisung ja aktuell wie im Beispiel an 5 Einträge gebunden bin und weil es so auch sehr unschön aussieht.

Habe aktuell aber keine Idee wie ich das anders lösen kann.

Habt ihr weitere Anregungen?


 switch (args.Count)
            {
                case 1:
                    dialog.Filter = $@"({args[0]})|{args[0]}";
                    break;
                case 2:
                    dialog.Filter = $@"({args[0]};{args[1]})|{args[0]};{args[1]}";
                    break;
                case 3:
                    dialog.Filter = $@"({args[0]};{args[1]};{args[2]})|{args[0]};{args[1]};{args[2]}";
                    break;
                case 4:
                    dialog.Filter = $@"({args[0]};{args[1]};{args[2]};{args[3]})|{args[0]};{args[1]};{args[2]};{args[3]}";
                    break;
                case 5:
                    dialog.Filter = $@"({args[0]};{args[1]};{args[2]};{args[3]};{args[4]})|{args[0]};{args[1]};{args[2]};{args[3]};{args[4]}";
                    break;
                default:
                    dialog.Filter = string.Empty;
                    break;
            }

Grüße

Pico
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Experte



Dabei seit:
Beiträge: 2.086
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

Warum machst du das ganze nicht einfach mit einer Schleife über einen StringBuilder?
Die einfachste Variante würde dann so aussehen(ungetestet).


private string BuildFileFilter(List<string> args)
{
    StringBuilder builder = new StringBuilder();

    for(int i = 0; i < args.Count; i++)
    {
        string arg = args[i];
        builder.Append(arg);

        if(i < args.Count - 1)
            builder.Append(";");
    }

    string filter = builder.ToString();
    
    return $"({filter})|{filter}";
}

Wenn args.Count == 0, musst du nur direkt String.Empty liefern, dann hast du das gleiche Verhalten wie mit deinem switch.
Dann kannst du auch noch X Filter mehr haben und es läuft trotzdem wie gehabt.

T-Virus
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von T-Virus am .
Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 9.998

beantworten | zitieren | melden

Naja, eine schleife und 2 strings die du anschließend nur noch zusammen an die Filter property "hängst" ist doch nicht so schwer.
Man baut übrigens im ersten Teil den Teil ein, den der User sieht, und da schreibt man den Filetyp aus.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von FZelle am .
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Experte



Dabei seit:
Beiträge: 2.086
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

@FZelle
In dem Fall könnte man die String Liste durch einen Container ersetzen, der dann den Anzeigenamen und die Endung enthält.
Dann könnte man im ersten Teil die Anzeigenamen und im zweiten Teil die Endungen einfügen.
Liese sich dann auch mit einer Schleife, dann aber mit zwei Buildern lösen.

T-Virus
Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16.293

beantworten | zitieren | melden

Das letzte Semikolon ist doch ohnehin irrelevant, wenn mich nicht alles täuscht.
Dann reicht ja einfach nur


string filter = string.Join(';', filterTypes);
return $"({filter})|{filter}";

Nen Builder hat auch Overhead.
Immer nen Builder pauschal zu nutzen ist daher auch nicht das Gelbe vom Ei.
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Experte



Dabei seit:
Beiträge: 2.086
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

Ah, ich vergess immer String.Join
Klar in dem Fall kann man den Builder dann komplett aussparen.

T-Virus
Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.575

beantworten | zitieren | melden

Zitat von T-Virus
Ah, ich vergess immer String.Join
Klar in dem Fall kann man einen eigenen Builder dann komplett aussparen.
FTFY ;-)

Intern wird auch ein StringBuilder verwendet: String.Join
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16.293

beantworten | zitieren | melden

Zitat von Th69
Intern wird auch ein StringBuilder verwendet: String.Join
Nur im Legacy Code; die neue .NET Welt nimmt den ValueStringBuilder, der im Inneren mit Span<> arbeitet.
https://source.dot.net/#System.Private.CoreLib/String.Manipulation.cs,6e6a5aca26ffb146

private Nachricht | Beiträge des Benutzers