MSDN建议您使用OpenFileDialog类,以允许用户在程序需要此功能时选择一个或多个文件。程序员可以选择在此对话框中添加一个或多个过滤器,以便仅显示扩展名与所选过滤器匹配的文件。这可以通过设置OpenFileDialog.Filter属性来完成。
但是,要执行此操作,您必须创建一个格式正确的字符串,其中包含过滤器所需的信息,如下所示:
dlg.Filter = "Supported Sound Files (*.flac, *.mp3)|*.flac;*.mp3|Flac files (*.flac)|*.flac|MP3 files (*.mp3)|*.mp3";
随着添加更多不同的过滤器,这很快变得相当混乱。
我的问题是,为什么这个属性是一个必须遵循特定格式的字符串?这有什么好处,而不是,例如,使用Dictionary< string,string []>,其中第一个字符串是过滤器的名称,第二个名称是此过滤器支持的文件扩展名数组,或类似的东西。
答案 0 :(得分:1)
我的问题是,为什么这个属性是一个必须遵循特定格式的字符串?
我怀疑这是Windows API的回归,其中OPENFILENAME
的lpstrFilter
实际上正在使用此格式,空字符替换|
个字符,两个终止为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)));
}