2016-08-01 98 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超载。你可以使用带有'seed'参数的重载:如果没有元素,这将会返回种子。

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|*.*"; 
相关问题