5
votes

Ajout dynamique de .EndsWith () à partir de la zone de liste déroulante

J'ai une liste déroulante appelée comboFileTypes . À l'intérieur se trouve une liste déroulante contenant:

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

Et après avoir appuyé sur un bouton, j'ai le code suivant pour rechercher des fichiers dans un répertoire:

MP4
MOV
MKV
VOB

Qui est codé en dur. Je veux que l'option WHERE soit générée dynamiquement à partir de la liste déroulante à la place, afin que l'utilisateur puisse ajouter un autre type de fichier s'il en a besoin. (Aussi insensible à la casse, si c'est possible, sinon je vais simplement ajouter les deux cas)

Toute aide serait appréciée.


4 commentaires

voulez-vous rechercher l'élément sélectionné? ou tous les éléments / fichiers dans la liste déroulante?


@MongZhu Tous les fichiers se terminant par les extensions répertoriées dans la liste déroulante. Actuellement, ils sont codés en dur, ce qui n'est pas ce que je veux.


Quel est le rôle de la combo box dans le scénario? L'utilisation peut simplement sélectionner un seul élément dans ComboBox . Parlez-vous peut-être d'une zone de liste à sélection multiple d'une liste de contrôle? Ou s'il s'agit d'un seul élément de zone de liste déroulante, contient-il plusieurs extensions séparées par | ou quelque chose?


Quoi qu'il en soit, utilisez l'une des solutions ici: Comment filtrer Directory.EnumerateFiles avec plusieurs critères? . Vous avez juste besoin d'obtenir les extensions de quelque part, d'un élément, des éléments sélectionnés ou .....


5 Réponses :


4
votes

Vous pouvez obtenir des valeurs de ComboBox par

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

et l'utiliser comme ceci:

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


3 commentaires

Cela a l'air bien, mais je reçois un soulignement rouge sur le ComboBoxItem , l'espace de noms est introuvable?


Bien mieux: Where (s => values.Any (v => s.EndsWith (v, StringComparison.OrdinalIgnorecase)); . Cela couvre également les extensions de fichiers à casse mixte comme par exemple ".Mp4".


@ KlausGütter Oui, vous avez absolument raison! J'ai mis à jour la réponse.



0
votes

Eh bien, il me manque peut-être quelque chose de gros, mais ...

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

La clé ici est que ComboBox a un SelectedItem em > propriété, qui peut être null si rien n'est sélectionné, ou maintenir l'option sélectionnée.

Si vous souhaitez sélectionner toutes les extensions, vous pouvez utiliser les éléments propriété.

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

J'espère que cela vous aidera.


1 commentaires

Merci - mais cela n'ajoute que l'élément sélectionné dans la liste déroulante, je les veux tous.



0
votes

Récupérez toutes les extensions de la zone de liste déroulante:

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

Rechercher en ignorant la casse en énumérant tous les fichiers du répertoire:

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

Vous pouvez également rechercher pour les extensions spécifiées uniquement:

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


0 commentaires

0
votes

essayez ce code:

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 commentaires

0
votes

une autre possibilité serait d'utiliser le modèle de recherche. Malheureusement, il n'est pas possible de rechercher plusieurs modèles à la fois. Mais vous pouvez utiliser SelectMany pour parcourir la liste des modèles et aplatir les résultats de la recherche en une seule liste:

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

Les noms de fichiers seront classés comme la liste des modèles p>


0 commentaires