FileDialog过滤器 - LINQ连接

时间:2017-02-27 14:50:26

标签: c# string linq filter filedialog

在创建显示OpenFileDialog / SaveFileDialog的服务时,我正在考虑为Concatinate() / Join()过滤器表达式创建LINQ查询/清除C#代码。

根据此调用进行过滤:

string res = "";
if(new Service().ShowOpenFileDialog(out res,
      new string[]{ "JPG", "TXT", "FBX"},
      new string[]{ "Images", "TextFile", "FilmBox"}))
    Console.WriteLine(res); //DisplayResult

示例定义:

public bool ShowOpenFileDialog(out string result, string[] ext, string[] desc)
{
    if(ext.Length != desc.Length) return false;

    OpenFileDialog diag = new OpenFileDialog();

    // problematic part
    // diag.Filter = "Text File (*.txt)|*.txt";
    // diag.Filter = desc[0] + " (*." + ext[0] + ")|*." + ext[0];
    // diag.Filter += "|"+desc[1] + " (*." + ext[1] + ")|*." + ext[1];

    // I tried something like:
    // diag.Filter = String.Join("|", desc.Concat(" (*." + ext[0] + ")|*." + ext[0]));
    // but not sure how to pass indexes across LINQ queries

    diag.Filter = /* LINQ? */

    if(diag.ShowDialog() == true)
    {
        result = diag.FileName;
        return true;
    }
    return false;
}

问题:是否可以创建LINQ以这种格式连接/连接2个数组?需要通过代码来完成吗?如果是这样,什么是最干净/最便宜的解决方案?

注意:作为过滤器(结果)示例:

"Images (*.JPG)|*.JPG |TextFile (*.TXT)|*.TXT |FilmBox (*.FBX)|*.FBX"

编辑:另请注意数组中可能有n项。

1 个答案:

答案 0 :(得分:3)

您应该使用Select来迭代您的收藏。此外,字符串插值在这里派上用场。

string filter = string.Join
                       ( "|"
                       , ext.Zip
                             ( desc
                             , (e, d) => new
                                         { Ext = e
                                         , Desc = d
                                         }
                             )
                            .Select(item => $"{item.Desc} (*.{item.Ext})|*.{item.Ext}")
                       );