2017-02-27 2 views
2

Beim Erstellen von Service zur Anzeige OpenFileDialog/SaveFileDialog, ich dachte über die Erstellung von LINQ Abfrage/C# -Code zu Concatinate()/Join() Filterausdruck.FileDialog-Filter - LINQ-Konkation

den Filter kommen Sie mit diesem Aufruf basiert:

string res = ""; 
if(new Service().ShowOpenFileDialog(out res, 
     new string[]{ "JPG", "TXT", "FBX"}, 
     new string[]{ "Images", "TextFile", "FilmBox"})) 
    Console.WriteLine(res); //DisplayResult 

Beispiel Definition:

public bool ShowOpenFileDialog(out string result, string[] ext, string[] desc) 
{ 
    if(ext.Length != desc.Length) return false; 

    OpenFileDialog diag = new OpenFileDialog(); 

    // problematic part 
    // diag.Filter = "Text File (*.txt)|*.txt"; 
    // diag.Filter = desc[0] + " (*." + ext[0] + ")|*." + ext[0]; 
    // diag.Filter += "|"+desc[1] + " (*." + ext[1] + ")|*." + ext[1]; 

    // I tried something like: 
    // diag.Filter = String.Join("|", desc.Concat(" (*." + ext[0] + ")|*." + ext[0])); 
    // but not sure how to pass indexes across LINQ queries 

    diag.Filter = /* LINQ? */ 

    if(diag.ShowDialog() == true) 
    { 
     result = diag.FileName; 
     return true; 
    } 
    return false; 
} 

Frage: Ist es möglich, LINQ zu erstellen verketten/beitreten 2-Arrays in einem solchen Format? Ist es erforderlich, es durch Code zu tun? Wenn ja, was ist die sauberste/günstigste Lösung?

Hinweis: Als Filter (Ergebnis) Beispiel:

"Images (*.JPG)|*.JPG |TextFile (*.TXT)|*.TXT |FilmBox (*.FBX)|*.FBX" 

EDIT: Sehen Sie sich auch bitte könnte es n Elemente in den Arrays.

Antwort

2

Sie sollten Select verwenden, um über Ihre Sammlung zu iterieren. Auch hier ist die String-Interpolation hilfreich.

string filter = string.Join 
         ("|" 
         , ext.Zip 
          (desc 
          , (e, d) => new 
             { Ext = e 
             , Desc = d 
             } 
          ) 
          .Select(item => $"{item.Desc} (*.{item.Ext})|*.{item.Ext}") 
         ); 
+0

Danke für die Antwort, aber wenn ich diese 1to1 in den Code setzen, ist Ausgabe: '(* .I) | * .m | (* .T) | * .e | (* .F) | * .i' – Tatranskymedved

+0

Nicht sicher, was ich dachte, aber die aktualisierte Antwort sollte besser sein. –

+0

In der Tat ist es, aber noch nicht klar Ergebnis. =), behoben über Bearbeiten. – Tatranskymedved