OpenFileDialog.Filter的类型是一个字符串?为什么?

时间:2013-10-15 23:44:49

标签: .net openfiledialog

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

但是,要执行此操作,您必须创建一个格式正确的字符串,其中包含过滤器所需的信息,如下所示:

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

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

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

1 个答案:

答案 0 :(得分:1)

  

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

我怀疑这是Windows API的回归,其中OPENFILENAMElpstrFilter实际上正在使用此格式,空字符替换|个字符,两个终止为null字符。

  

这有什么好处,相比之下,例如,使用Dictionary,其中第一个字符串是过滤器的名称,第二个名称是此过滤器支持的文件扩展名数组,或类似的东西。

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

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

虽然可以很容易地构建一些东西来处理这个问题:

public static string BuildFileFilter(Dictionary<string, string[]> filters)
{
   return string.Join("|", 
                     filters.Select(kvp => kvp.Key 
                                           + "|" + string.Join(";", kvp.Value)));
}