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}")
);
在创建显示 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}")
);