2013-10-15 37 views
1

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

要做到这一点,但是,你必须创建一个包含信息的过滤器的需求,这样的正确格式的字符串:

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

会陆续添加更多不同的过滤器,这很快就变得相当混乱。

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

+1

因为这是它在Windows 18年前所做的那样。不要认为典型的用户不会提供关于音频文件格式的声音,甚至不会看到它们。 –

回答

1

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

我怀疑这是一个倒退到Windows API,其中OPENFILENAMElpstrFilter有效地使用这种格式,以空字符替换|角色,和两个终止空字符。

这有什么好处,例如,与使用字典相反,第一个字符串是过滤器的名称,第二个名称是该过滤器支持的文件扩展名的数组,或者其他名称像那样。

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

当然,缺点是不得不使用奇怪格式的“魔术串”。

这将是很容易建立的东西来处理这个给你,虽然:

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