6
votes

Débogage LINQ sur une base par élément

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


1 commentaires

Quel genre de Linq est-ce? EF ou Linq à SQL?


5 Réponses :


3
votes

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.


0 commentaires

2
votes
var data = file_contents.Select(s => {
    try
    {
       return double.Parse(s);

    }
    catch
    {
       throw; //breakpoint?
    }
});

0 commentaires

0
votes

Je voudrais simplement utiliser une trypairse personnellement.

Good Data:
0.46578
12.314213
1.444876


Bad Data:
[2, Error: Could not calculate value.]


3 commentaires

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 2 + i fois, où i est le nombre de lignes incorrectes - Indexof iTère la collection à partir de tout ce qui est appelé. Vous avez également parse toutes les lignes au moins deux fois et la plupart d'entre eux trois fois (deux tryparse et un analysez 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 "



0
votes

Je ne suis pas sûr de savoir pourquoi vous n'aimez pas 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.

Je voudrais probablement mélanger linq avec 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
}


0 commentaires

2
votes

Disclaimer: je travaille pour OZCode

Le débogage de Linq est difficile à la limite de Visual Studio. Je vous suggère d'essayer d'utiliser OZCode.

C'est à quoi ressemble votre code lors du débogage (l'exception dans le 6ème article). Exception de débogage LINQ

Vous pouvez dire quel élément a provoqué l'exception en enquêtant sur les éléments qui ont été transmis à la clause Select et, puisque la dernière a déclenché l'exception - il est facile de trouver la valeur incriminée.

Si vous êtes intéressé, vous pouvez essayer le débogage LINQ d'OzCode - Nous venons de démarrer un EAP


0 commentaires