Динамически добавляем .EndsWith () из выпадающего списка - PullRequest
0 голосов
/ 16 января 2019

У меня есть поле со списком 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 ]

0 голосов
/ 16 января 2019

другая возможность, будет использовать шаблон поиска. К сожалению, невозможно найти несколько шаблонов одновременно. Но вы можете использовать SelectMany для сканирования списка шаблонов и свести результаты поиска в один список:

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

Имена файлов будут упорядочены как список шаблонов

0 голосов
/ 16 января 2019

попробуйте этот код:

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)));
0 голосов
/ 16 января 2019

Ну, может быть, мне не хватает чего-то большого, но ...

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

Ключевым моментом здесь является то, что ComboBox имеет свойство 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;
}

Надеюсь, это поможет.

0 голосов
/ 16 января 2019

Получить все расширения из выпадающего списка:

 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));
0 голосов
/ 16 января 2019

Вы можете получить значения из ComboBox по

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

и используйте его следующим образом:

var files = Directory
    .EnumerateFiles(sourceDIR.Text, "*.*", SearchOption.AllDirectories)
    .Where(s => values.Any(v => s.EndsWith(v, StringComparison.OrdinalIgnorecase));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...