【问题标题】:LINQ: sequence contains no elementsLINQ:序列不包含任何元素
【发布时间】:2016-12-06 05:55:42
【问题描述】:

我的错误序列在下一行不包含任何元素

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

【问题讨论】:

  • 你从哪里获得 loaders?可能是空的
  • 第二个。 LINQ 看起来不错。另外,如果loaders 为空,您最终会得到一个额外的管道 |在“所有文件”部分的前面
  • 你的问题是什么?

标签: c# linq fileopendialog


【解决方案1】:

如果序列不包含任何元素,您正在使用的 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);

【讨论】:

    【解决方案2】:

    您的代码可以简化为:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-29
      • 1970-01-01
      • 2011-09-01
      • 2012-04-12
      • 1970-01-01
      • 1970-01-01
      • 2015-09-04
      • 2015-02-19
      相关资源
      最近更新 更多