2016-08-01 15 views
0

ich habe auf unterhalb der Linie kein Element FehlerfolgeLINQ: Sequenz enthält keine Elemente

Microsoft.Win32.OpenFileDialog dialog = new Microsoft.Win32.OpenFileDialog(); 
      dialog.Multiselect = true; 
      dialog.Filter = 
       loaders 
       .Select(loader => string.Format("{0}|{1}", loader.Metadata.Alias, loader.Metadata.ExtensionFilter)) 
       .Aggregate((f1, f2) => f1 + "|" + f2); 
      dialog.Filter += "|All Files|*.*"; 
+1

wo Sie * Lader * erhalten Sie? wahrscheinlich ist es leer –

+0

Sekunde, dass. LINQ sieht gut aus. plus, falls "loaders" leer ist, würden Sie mit einer zusätzlichen Pipe enden vor dem Teil "Alle Dateien" – dlatikay

+0

Was ist Ihre Frage? – n0rd

Antwort

2

Die Überlastung von Enumerable.Aggregate enthält Sie verwenden eine Exception aus, wenn die Sequenz keine Elemente enthält. Sie können die Überladung verwenden, die ein "Seed" -Argument verwendet: Dies wird nur den Seed zurückgeben, wenn keine Elemente vorhanden sind.

loaders 
    .Select(loader => string.Format("{0}|{1}", loader.Metadata.Alias, loader.Metadata.ExtensionFilter)) 
    .Aggregate(string.Empty, (f1, f2) => f1 + "|" + f2); 

Noch besser wäre Aggregat insgesamt zu Graben - Sie sind möglicherweise viele Strings Zuweisung Sie werfen weg, bevor Sie zu Ihrem Ergebnis. Verwenden Sie einfach string.Join:

var loaderFilters = loaders.Select(loader 
    => string.Format("{0}|{1}", loader.Metadata.Alias, loader.Metadata.ExtensionFilter)); 

var allFilters = loaderFilters.Concat(new []{"All Files|*.*"}); 

dialog.Filter = string.Join("|", allFilters); 
+0

der zweite Vorschlag ist richtig und funktioniert perfekt –

0

Ihr Code vereinfacht werden kann:

Microsoft.Win32.OpenFileDialog dialog = new Microsoft.Win32.OpenFileDialog(); 
dialog.Multiselect = true; 
dialog.Filter = string.Join("|", loaders.Select(loader => loader.Metadata.Alias + "|" + loader.Metadata.ExtensionFilter)) + "|All Files|*.*";