1
votes

Comment renvoyer une fausse condition à partir de la méthode des tables de données?

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


2 commentaires

public bool TryReadFolder (string path, string ext, out DataTable dataTable) vous permet de rechercher le reste


Si vous n'avez pas besoin d'informations spécifiques, la réponse la plus simple est simplement de renvoyer null .


3 Réponses :


0
votes

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){


0 commentaires

0
votes

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.


1 commentaires

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.



0
votes

Vous pouvez renvoyer bool ou lancer une exception pour la condition donnée.


0 commentaires