FileDialog 过滤器 - LINQ 串联

FileDialog filter - LINQ concatenation

在创建显示 OpenFileDialog/SaveFileDialog 的服务时,我正在考虑为 Concatinate()/Join() 过滤器表达式创建 LINQ query/clear 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 to concatenate/join 2 这种格式的数组?是否需要通过代码来完成?如果是这样,cleanest/least 昂贵的解决方案是什么?

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

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

编辑: 另外请考虑数组中可能有 n 个项目。

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

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