1

如果您的程序需要此功能,MSDN 建议您使用 OpenFileDialog 类来允许用户选择一个或多个文件。程序员可以选择向此对话框添加一个或多个过滤器,以便仅显示扩展名与所选过滤器匹配的文件。这可以通过设置 OpenFileDialog.Filter 属性来完成。

但是,要做到这一点,您必须创建一个格式正确的字符串,其中包含过滤器所需的信息,如下所示:

dlg.Filter = "Supported Sound Files (*.flac, *.mp3)|*.flac;*.mp3|Flac files (*.flac)|*.flac|MP3 files (*.mp3)|*.mp3";

随着添加更多不同的过滤器,这很快变得相当混乱。

我的问题是,为什么这个属性是一个必须遵循特定格式的字符串?与例如使用 Dictionary<string, string[]> 相比,这样做有什么优势,其中第一个字符串是过滤器的名称,第二个名称是此过滤器支持的文件扩展名数组,或者类似的东西。

4

1 回答 1

1

我的问题是,为什么这个属性是一个必须遵循特定格式的字符串?

我怀疑这是对 Windows API 的回归,其中OPENFILENAME'slpstrFilter有效地使用了这种格式,用一个空字符替换|字符,以及两个终止空字符。

与使用字典相比,这样做有什么优势,例如使用字典,其中第一个字符串是过滤器的名称,第二个名称是此过滤器支持的文件扩展名数组,或类似的东西。

这里的主要优点纯粹是简单。单个字符串的代码远少于 aDictionary<T,U>其中值本身是需要构造的对象(即: a string[])。通常,文件过滤器通常不会在运行时更改,因此字符串实际上是一个确定一次的常量。

当然,缺点是必须使用一种奇怪格式的“魔术字符串”。

不过,为您构建一些东西来处理这个问题是相当容易的:

public static string BuildFileFilter(Dictionary<string, string[]> filters)
{
   return string.Join("|", 
                     filters.Select(kvp => kvp.Key 
                                           + "|" + string.Join(";", kvp.Value)));
}
于 2013-10-15T23:49:12.960 回答