12
votes

LINQ Min imbriqué () Crashes Visual Studio

J'ai un morceau de code qui rend le studio Visual Studio 2008 EDIRE est très lent, consommez de vastes quantités de mémoire, puis éventuellement la causer de crash. Je soupçonne que vs frappe une limite de mémoire du système d'exploitation.

Le code suivant n'est pas mon vrai code d'application, mais il simule le problème. Essentiellement, j'essaie de trouver la valeur minimale dans un arbre à l'aide de LINQ. P>

class LinqTest
{
    public class test
    {
        public int val;
        public List<test> Tests;
    }

    private void CrashMe()
    {
        test t = new test();

        //Uncomment this to cause the problem
        //var x = t.Tests.Min(c => c.Tests.Min(d => d.Tests.Min(e => e.Tests.Min(f=>f.Tests.Min(g=>g.Tests.Min(h => h.val))))));
    }
}


0 commentaires

7 Réponses :


3
votes

J'ai pu reproduire cela sur mon installation Visual Studio 2008. On dirait que le service de langue frappe une boucle infinie et éventuellement à court de mémoire. Pouvez-vous s'il vous plaît déposer un bogue sur le site de connexion?

Connect: http://connect.microsoft.com

Si vous faites le fichier, veuillez ajouter un commentaire à ma réponse avec le numéro de bogue.


1 commentaires

Je travaille avec l'affiche originale et j'ai soumis le rapport de bogue sous mon identifiant: Connect.Microsoft.com/visualstudio/feedback/.../a>



0
votes

Vous n'avez même pas à aller aussi loin. Vs froze pour moi lorsque vous tapez dans la partie d de l'expression LINQ imbriquée.


0 commentaires

3
votes

Déférence de type pour les expressions Lambda imbriquées prend du temps exponentiel . Donc, ce n'est pas surprenant que le compilateur se lente lorsque vous faites trop de nidification.

Cependant, l'IDE manquerait idéalement de tels cas et ferait l'inférence de type si sa prise trop longue.


1 commentaires

J'ai ajouté votre lien, etc. comme un commentaire sur le rapport de bogue. Il est probablement trop demander à SM de résoudre un problème du NP-dur, mais votre idée de délai d'expiration est une bonne.



0
votes

pensais que je soulignerais que cela gèle également VS 2010 et que c'est plus loin, il a presque frotté tout mon système!


0 commentaires

1
votes

Utilisation de la récursion de base au lieu d'essayer de "deviner" la profondeur, une complexité croissante à tous les niveaux xxx

comme indiqué par Ryan Versa favoris, vous pouvez également le faire sans méthodes d'extension, telles que: xxx


1 commentaires

C'était la même solution que j'ai immédiatement pensée. Je voudrais souligner que cette méthode d'extension n'est vraiment nécessaire que si vous n'avez pas de contrôle de votre classe de test (ou si elle n'est utilisée que pour les tests et ne serait pas logique d'avoir une méthode normale).




0
votes

Je pense que je viens de vivre quelque chose de similaire. Je traversais mon code et en utilisant var sur les lignes où je déclarais et initialiser les variables à Nouveau SOMECLASS () . Mon code compilé. Lorsque j'ai essayé d'exécuter un test d'unité Visual Studio 2008, Visual Studio se bloque avec CLR20R3 comme nom d'erreur / type. Renvoyant toutes mes modifications var , les tests fonctionnent bien.


0 commentaires