从组合框动态添加.EndsWith()

时间:2019-01-16 09:19:49

标签: c# winforms

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

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")); 选项,以便用户可以根据需要添加其他类型的文件。 (如果可能的话,也不区分大小写,否则我将两种情况都加进去)

任何帮助将不胜感激。

5 个答案:

答案 0 :(得分:4)

您可以通过

从组合框获取值
var values = comboFileTypes.Items.Cast<string>()

并像这样使用它:

var files = Directory
    .EnumerateFiles(sourceDIR.Text, "*.*", SearchOption.AllDirectories)
    .Where(s => values.Any(v => s.EndsWith(v, StringComparison.OrdinalIgnorecase));

答案 1 :(得分:0)

好吧,也许我错过了一些大事,但是...

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;
}

希望这会有所帮助。

答案 2 :(得分:0)

从组合框获取所有扩展名:

 var extensions = comboFileTypes.Items.Cast<string>().Select(x => "." + x);

通过枚举目录中的所有文件来忽略大小写:

var files = Directory.EnumerateFiles(sourceDIR.Text, "*.*", SearchOption.AllDirectories).Where(x => extensions.Any(y => y.Equals(Path.GetExtension(x), StringComparison.OrdinalIgnoreCase)));

您也可以只搜索指定的扩展名:

 var files = extensions.AsParallel().SelectMany(x => Directory.EnumerateFiles(sourceDIR.Text, "*" + x, SearchOption.AllDirectories));

答案 3 :(得分:0)

尝试此代码:

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)));

答案 4 :(得分:0)

另一种可能性是使用搜索模式。不幸的是,不可能一次搜索多个模式。但是您可以使用SelectMany浏览模式列表并将搜索结果展平为一个列表:

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

文件名将作为模式列表排序