Existe-t-il un moyen de simplifier cette expression linq ou existe-t-il un meilleur moyen de le faire?
Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories)
.Where(s => s.EndsWith(".jpg", StringComparison.OrdinalIgnoreCase) ||
s.EndsWith(".gif", StringComparison.OrdinalIgnoreCase) ||
s.EndsWith(".png", StringComparison.OrdinalIgnoreCase) ||
...);
En gros, je veux renvoyer tous les fichiers d’une certaine extension. Malheureusement, cette méthode n'est pas très flexible. Je préférerais pouvoir ajouter des extensions à une liste et faire en sorte que Directory.GetFiles renvoie ces extensions. Est-ce possible?
Si vous souhaitez effectuer votre filtrage dans LINQ, vous pouvez le faire comme suit:
var ext = new List<string> {".jpg", ".gif", ".png"};
var myFiles = Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories)
.Where(s => ext.Contains(Path.GetExtension(s)));
Maintenant, ext
contient une liste des extensions autorisées; vous pouvez en ajouter ou en supprimer si nécessaire pour un filtrage flexible.
La surcharge Directory.GetFiles(String, String)
ne le fait-elle déjà? Vous ne feriez que Directory.GetFiles(dir, "*.jpg", SearchOption.AllDirectories)
Si vous voulez les mettre dans une liste, remplacez simplement le "*.jpg"
avec une variable qui parcourt une liste et agrège les résultats dans un ensemble de résultats global. Beaucoup plus clair que de les spécifier individuellement. =)
Quelque chose comme...
foreach(String fileExtension in extensionList){
foreach(String file in Directory.GetFiles(dir, fileExtension, SearchOption.AllDirectories)){
allFiles.Add(file);
}
}
(Si vos répertoires sont volumineux, l'utilisation de EnumerateFiles
au lieu de GetFiles
peut potentiellement être plus efficace)
J'aurais fait en utilisant une seule ligne comme
List<string> imageFiles = Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories)
.Where(file => new string[] { ".jpg", ".gif", ".png" }
.Contains(Path.GetExtension(file)))
.ToList();