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
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.
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.
@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.
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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.
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
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
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code