2016-08-01 7 views
0

я не последовательность ошибок содержит ни одного элемента на строку нижеLINQ: Последовательность не содержит элементов

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

где вы получите * погрузчики *? вероятно, пусто –

+0

секунд. LINQ выглядит отлично. плюс, в случае, если 'loaders' пуст, вы получите лишнюю трубу | перед частью «Все файлы» – dlatikay

+0

Что вы хотите сказать? – n0rd

ответ

2

Перегрузка Enumerable.Aggregate вы используете сгенерирует исключение, если последовательность не содержит элементов. Вы можете использовать перегрузку, которая принимает аргумент «семя»: это просто вернет семя, если нет элементов.

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

еще лучше было бы угробить агрегат в целом - вы потенциально выделять много строк вы выбрасывая, прежде чем попасть на ваш результат. Просто используйте 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

второе предложение правильное и прекрасно работает –

0

Ваш код может быть упрощена:

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|*.*";