J'aime les instructions LINQ pour la syntaxe expressif et d'autres fonctionnalités pratiques. Cependant, je trouve très gênant de les déboguer parfois. Plus précisément, lorsque je gère une instruction LINQ sur une collection et que l'un des éléments de la collection provoque une exception, comment puis-je déterminer quelle était la participation du problème et où le problème est venu?
Imagine avoir un fichier texte avec 1000 Numéros réels: P>
var data = new List<double>(); foreach(var row in file_contents) { var d = double.Parse(row); data.Add(d); }
5 Réponses :
Mettez un point d'arrêt conditionnel sur la fonction Lambda, où la condition est S.Startswith ("5.56"). Vous avez juste besoin d'avoir votre curseur sur la Lambda et appuyez sur F9. En supposant que vous utilisez Visual Studio. P>
var data = file_contents.Select(s => { try { return double.Parse(s); } catch { throw; //breakpoint? } });
Je voudrais simplement utiliser une trypairse personnellement.
Good Data: 0.46578 12.314213 1.444876 Bad Data: [2, Error: Could not calculate value.]
Bien merci pour la nature constructive de votre commentaire. Puisque vous avez une meilleure façon, seriez-vous si gentil de poster votre propre réponse qui n'est pas «la pire utilisation de Linq que vous ayez jamais vue».
Problème principal ici est un fait que votre solution itéitée sur data code>
2 + i code> fois, où
i code> est le nombre de lignes incorrectes -
Indexof code> iTère la collection à partir de tout ce qui est appelé. Vous avez également
parse code> toutes les lignes au moins deux fois et la plupart d'entre eux trois fois (deux
tryparse code> et un
analysez code> pour de bonnes valeurs). Ce n'est pas vraiment efficace, n'est-ce pas? J'ai posté ma réponse, n'hésitez pas à la critiquer!
Permettez-moi de vous montrer comment j'écrirais un commentaire lorsque le code pourrait être rendu plus efficace directement à partir de vos commentaires Sans les parties non constructives. "Votre solution itératée sur les données 2 + i fois, où j'ai un nombre de lignes incorrectes - Indexof itre la collection à partir de tout ce qui est appelé à chaque fois. Vous analysez également toutes les lignes au moins deux fois, et la plupart d'entre eux trois fois (deux tryparse et une Analysez pour de bonnes valeurs). Il existe déjà une surcharge de sélection avec un index fourni .. Sélectionnez (S, I) => Je suis l'index de "
Je ne suis pas sûr de savoir pourquoi vous n'aimez pas Je voudrais probablement mélanger linq avec foreach code> en boucle ici. LINQ l'utilise en interne quand même, et comme vous l'avez déjà compris, certains avantages et inconvénients d'utiliser Linq et de débogage sont l'un des inconvénients.
pour acheter code> et finir avec Suivant: P>
// read all lines from file //
var file_contents = File.ReadAllLines("myfile.txt");
// set initial data list length to number of lines for better performance
var data = new List<double>(file_contents.Length);
// list for incorrect line numbers
var incorrectRows = new List<int>();
foreach (var x in file_contents.Select((s, i) => new {s, i}))
{
// x.s - line string
// x.i - line number
double value;
if (double.TryParse(x.s, out value))
data.Add(value); // add value, which was OK
else
incorrectRows.Add(x.i); // add index of incorrect value
}
Disclaimer: je travaille pour OZCode em> p>
Le débogage de Linq est difficile à la limite de Visual Studio. Je vous suggère d'essayer d'utiliser OZCode. p>
C'est à quoi ressemble votre code lors du débogage (l'exception dans le 6ème article).
Vous pouvez dire quel élément a provoqué l'exception en enquêtant sur les éléments qui ont été transmis à la clause Select em> et, puisque la dernière a déclenché l'exception - il est facile de trouver la valeur incriminée. p>
Si vous êtes intéressé, vous pouvez essayer le débogage LINQ d'OzCode - Nous venons de démarrer un EAP a> p> P>
Quel genre de Linq est-ce? EF ou Linq à SQL?