Je veux demander s'il existe un moyen d'obtenir une fausse condition en retournant des données? je veux obtenir la fausse condition de cette fonction readFolder si la taille> 4000
public DataTable readFolder(string path, string ext){ MBer = new Models.MBerkas(); DataTable dt = new DataTable(); DataRow dr; //Initialize Directory path string ax = path; string[] s1 = Directory.GetFiles(ax, "*."+ext+"*", SearchOption.AllDirectories); //File Name, File Type, File size, create date for (int i = 0; i <= s1.Length - 1; i++) { dt = MBer.setHeader; FileInfo f = new FileInfo(s1[i]); FileSystemInfo f1 = new FileInfo(s1[i]); double size = Math.Round(Convert.ToDouble(f.Length / 1024), 0); if (size <= 4000) { int lineCount = MBer.getLineCount(s1[i]); dr = dt.NewRow(); dr = MBer.getRowTable(dr, f1, f, lineCount); dt.Rows.Add(dr); } else { MessageBox.Show("" + f1.Name + " size too large."); return false; } } return dt; }
3 Réponses :
Vous pouvez lever une exception à partir de la fonction ou avoir un paramètre out
que vous vérifierez:
public DataTable readFolder(string path, string ext, out bool valid){
Je vais prendre une direction différente et suggérer quelque chose de plus comme ceci:
public async IAsyncEnumerable<(FileInfo, FileSystemInfo)> readFolder(string path, string ext) { var d = new DirectoryInfo(path); var s1 = d.EnumerateFiles("*."+ext+"*", SearchOption.AllDirectories); foreach(FileInfo fi in s1) //FileInfo inherits from FileSystemInfo! You don't need both. { if (fi.Length < 4097024) // 4097024 is the first value n where round(n/1024)>4000 { yield reutrn fi; } else { // **LOG** the results, or add to a collection you can check afterwards that was passed as an argument. // You could also *break* here, to leave the loop and just stop. } } }
Il y a beaucoup moins de code ici, mais il exécutera BEAUCOUP PLUS RAPIDEMENT (Je vous sauve au moins trois recherches de disque par fichier!) Et soyez beaucoup plus tolérant aux pannes, et cela vous donne toutes les mêmes données. De plus, la présence de l'espace de noms Models
suggère MVC, où la fonction async
peut créer une autre grande victoire en termes de performances.
Pour expliquer le nombre magique qui a remplacé le critère de taille
, il est facile de le trouver en écrivant un programme court , et vous gagnez en outre du temps de calcul sur chaque fichier.
Même si vous voulez vraiment la datatable, j'écrirais toujours ce code à la place, puis l'envelopper dans une autre méthode qui utilise ce résultat pour créer votre table.
IAsyncEnumerable
sur un itérateur standard est un choix curieux. Il n'y aura pas de rappels d'achèvement d'E / S ici et lieront tout de même un thread.
Vous pouvez renvoyer bool
ou lancer une exception pour la condition donnée.
public bool TryReadFolder (string path, string ext, out DataTable dataTable)
vous permet de rechercher le resteSi vous n'avez pas besoin d'informations spécifiques, la réponse la plus simple est simplement de renvoyer
null
.