代码之家  ›  专栏  ›  技术社区  ›  Chud37

从组合框动态添加.endsWith()。

  •  5
  • Chud37  · 技术社区  · 7 年前

    我有一个叫 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 选项将从组合框动态生成,以便用户可以根据需要添加其他类型的文件。(也不区分大小写,如果可能的话,否则我将添加两个大小写)

    任何帮助都将不胜感激。

    5 回复  |  直到 7 年前
        1
  •  4
  •   Marcin Topolewski    7 年前

    您可以通过以下方式从组合框中获取值:

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

    像这样使用它:

    var files = Directory
        .EnumerateFiles(sourceDIR.Text, "*.*", SearchOption.AllDirectories)
        .Where(s => values.Any(v => s.EndsWith(v, StringComparison.OrdinalIgnorecase));
    
        2
  •  0
  •   Baltasarq    7 年前

    嗯,也许我错过了什么大的东西,但是…

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

    这里的关键是 组合框 有一个 选择项目 属性,可以是 null 如果未选择任何内容,或保留所选选项。

    如果要选择所有扩展名,则可以使用 项目 财产。

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

    希望这有帮助。

        3
  •  0
  •   Ebraheem    7 年前

    试试这个代码:

    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
  •   Pablo notPicasso    7 年前

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

     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));
    
        5
  •  0
  •   Mong Zhu Bart de Boer    7 年前

    另一种可能是使用搜索模式。不幸的是,不能同时搜索多个模式。但是你可以用 SelectMany 要扫描模式列表并将搜索结果展平为单个列表,请执行以下操作:

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

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