LINQ:序列不包含任何元素
问题描述:
我有错误序列包含以下行没有元素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|*.*";
答
你使用如果序列不包含任何元素会抛出异常的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
第二个建议是正确的,作品完美 –
答
您的代码可以简化为:
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|*.*";
你在哪里得到*装载机*?那大概是空的 –
那个。 LINQ看起来很好。另外,如果'loaders'是空的,你最终会得到一个额外的管道|在“所有文件”部分前面 – dlatikay
你的问题是什么? – n0rd