Laden...

OpenFileDialog - dynamischer Filter

Erstellt von Pico1184 vor 3 Jahren Letzter Beitrag vor 3 Jahren 356 Views
Pico1184 Themenstarter:in
223 Beiträge seit 2009
vor 3 Jahren
OpenFileDialog - dynamischer Filter

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

T
2.219 Beiträge seit 2008
vor 3 Jahren

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

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.

F
10.010 Beiträge seit 2004
vor 3 Jahren

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.

T
2.219 Beiträge seit 2008
vor 3 Jahren

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

16.807 Beiträge seit 2008
vor 3 Jahren

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.

T
2.219 Beiträge seit 2008
vor 3 Jahren

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.

4.931 Beiträge seit 2008
vor 3 Jahren

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

16.807 Beiträge seit 2008
vor 3 Jahren

Intern wird auch ein StringBuilder verwendet:
>

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