C# 从combobox动态添加.EndsWith()

C# 从combobox动态添加.EndsWith(),c#,winforms,C#,Winforms,我有一个名为comboFileTypes的组合框。其中是一个下拉列表,包含: MP4 MOV MKV VOB 按下按钮后,我有以下代码来扫描目录中的文件: var files = Directory .EnumerateFiles(sourceDIR.Text, "*.*", SearchOption.AllDirectories) .Where(s => s.EndsWith(".mp4") || s.EndsWith(".mov")

我有一个名为
comboFileTypes
的组合框。其中是一个下拉列表,包含:

MP4
MOV
MKV
VOB
按下按钮后,我有以下代码来扫描目录中的文件:

var files = Directory
    .EnumerateFiles(sourceDIR.Text, "*.*", SearchOption.AllDirectories)
    .Where(s => 
        s.EndsWith(".mp4") || 
        s.EndsWith(".mov") || 
        s.EndsWith(".vob") ||
        s.EndsWith(".MP4") || 
        s.EndsWith(".MOV") || 
        s.EndsWith(".VOB"));
这是硬编码的。我希望从组合框中动态生成
WHERE
选项,以便用户可以根据需要添加其他类型的文件。(如果可能的话,也不区分大小写,否则我只添加两种情况)


任何帮助都将不胜感激。

您可以通过以下方式从ComboBox获取值:

var values = comboFileTypes.Items.Cast<string>()

嗯,也许我错过了一些重要的事情,但是

void onOpen()
{
    var selected = comobFileTypes.SelectedItem;

    if ( selected != null ) {
        string ext = "." + selected.ToString();

        var files = Directory.EnumerateFiles(sourceDIR.Text, "*.*", SearchOption.AllDirectories).Where(
                s => s.EndsWith( ext );

        // ...more things...
    }

    return;
}
这里的关键是组合框有一个SelectedItem属性,如果未选择任何内容,则该属性可以是
null
,或者保持选中的选项

如果要选择所有扩展名,则可以使用Items属性

void onOpen()
{
    string[] items = new string[ comboFileTypes.Items.Length ];

    foreach(int i = 0; i < items.Length; ++i) {
        items[ i ] = "." + comboFileTypes.Items[ i ].ToString();
    }

    var files = new List<string>();
    var allFiles = Directory.EnumerateFiles( sourceDIR.Text, "*.*", SearchOption.AllDirectories );

    foreach(string ext in items) {
        files.AddRange( allFiles.Where( s => s.EndsWith( ext ) );
    }

    // ...more things... with files...
    return;
}
void onOpen()
{
字符串[]项=新字符串[comboFileTypes.items.Length];
foreach(int i=0;is.EndsWith(ext));
}
//…更多的东西…文件。。。
返回;
}

希望这有帮助。

从combobox获取所有扩展:

 var extensions = comboFileTypes.Items.Cast<string>().Select(x => "." + x);
或者,您只能搜索指定的扩展名:

 var files = extensions.AsParallel().SelectMany(x => Directory.EnumerateFiles(sourceDIR.Text, "*" + x, SearchOption.AllDirectories));
请尝试以下代码:

List<string> items = new List<string>();
for (int i = 0; i < comboBox1.Items.Count; i++)
{
    items.Add(comboBox1.Items[i].ToString().ToLower());
}

var files = Directory
        .EnumerateFiles(sourceDIR.Text, "*.*", SearchOption.AllDirectories)
        .Where(file => items.Any(item => file.ToLower().EndsWith(item)));
List items=newlist();
对于(int i=0;iitems.Any(item=>file.ToLower().EndsWith(item)));

另一种可能是使用搜索模式。不幸的是,不可能同时搜索多个模式。但您可以使用
SelectMany
扫描模式列表,并将搜索结果平铺到单个列表中:

var allPatterns = comboFileTypes.Items.Cast<string>();
allPatterns.SelectMany(pattern => Directory.EnumerateFiles(@"F:\temp", $"*.{pattern}", SearchOption.AllDirectories));
var allPatterns=comboFileTypes.Items.Cast();
allPatterns.SelectMany(pattern=>Directory.EnumerateFiles(@“F:\temp”、$“*.{pattern}”、SearchOption.AllDirectories));

文件名将按模式列表排序

您想扫描所选项目吗?还是组合框中的所有项目/文件结尾?@MongZhu所有文件都以组合框中列出的扩展名结尾。目前它们是硬编码的,这不是我想要的。组合框在场景中的作用是什么?Use可以从中选择单个项目
ComboBox
。您可能在谈论checkedlistbox的多选列表框?或者如果它是单个组合框项目,它是否包含多个扩展名,以|或其他方式分隔?总之,请使用以下解决方案之一:。您只需从某处获取扩展名、一个项目、选定项目或…..谢谢-但仅此而已将所选项目添加到组合框中,我想要所有项目。看起来不错,但在
ComboBoxItem
上有一条红色下划线,找不到命名空间?更好:
Where(s=>values.Any(v=>s.EndsWith(v,StringComparison.OrdinalIgnorecase));
。这还包括混合大小写的文件扩展名,例如“.Mp4”@KlausGütter是的,你完全正确!我已经更新了答案。
List<string> items = new List<string>();
for (int i = 0; i < comboBox1.Items.Count; i++)
{
    items.Add(comboBox1.Items[i].ToString().ToLower());
}

var files = Directory
        .EnumerateFiles(sourceDIR.Text, "*.*", SearchOption.AllDirectories)
        .Where(file => items.Any(item => file.ToLower().EndsWith(item)));
var allPatterns = comboFileTypes.Items.Cast<string>();
allPatterns.SelectMany(pattern => Directory.EnumerateFiles(@"F:\temp", $"*.{pattern}", SearchOption.AllDirectories));