2017-02-27 122 views
2

虽然创建服务来显示OpenFileDialog/SaveFileDialog,我想创建LINQ查询/清除C#代码为Concatinate()/Join()过滤器表达式。FileDialog过滤器 - LINQ concatination

做基于此调用过滤器:

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项目。

回答

2

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

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

感谢您的回答,但是如果我把这个1to1放在代码中,输出是:'(* .I)| * .m | (* .T)| * .E | (* .F)| * .i' – Tatranskymedved

+0

不知道我在想什么,但更新的答案应该会更好。 –

+0

确实是,但尚不清楚的结果呢。 =),通过编辑修复。 – Tatranskymedved