2011-05-12 3 views
2

J'ai un problème lors de la tentative d'analyse d'un fichier Xml en objets à l'aide de Linq dans une application Windows Phone 7. La même requête linq fonctionne dans Silverlight.Erreur Linq to Objects dans la collection analysée

Voici le xml:

<?xml version="1.0" encoding="utf-8" ?> 
<students> 
    <student> 
    <firstName>John</firstName> 
    <lastName>Doe</lastName> 
    </student> 
    <student> 
    <firstName>Jane</firstName> 
    <lastName>Doe</lastName> 
    </student> 
</students> 

Et tout le code que j'ai est dans les MainPage.xaml.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 
using Microsoft.Phone.Controls; 
using System.Xml.Linq; 

namespace WindowsPhoneApplication2 
{ 
    public class Student 
    { 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
    } 

    public partial class MainPage : PhoneApplicationPage 
    { 
     // Constructor 
     public MainPage() 
     { 
      InitializeComponent(); 

      XDocument doc = XDocument.Load("my1.xml"); 

      var test = from students in doc.Elements("students").Elements("student") 
         select new Student() 
         { 
          FirstName = students.Element("firstName").Value, 
          LastName = students.Element("lastName").Value 
         }; 

      foreach (var _student in test) 
      { } 
     } 
    } 
} 

L'erreur que je reçois est assez bizarre (ce qui est à l'intérieur foreach lorsque vous regardez le test rapide): System.Collections.Generic.IEnumerator.Current = Impossible d'évaluer l'expression. System.Collections.Generic.IEnumerator.Current = 'System.Collections.Generic.IEnumerable' ne contient pas de définition pour 'System' et aucune méthode d'extension 'System' acceptant un premier argument de type 'System.Collections.Generic.IEnumerable

Pendant ce temps, à l'intérieur du foreach, le var _student a la valeur correcte à chaque itération ?! Cette erreur est-elle un bug? Ou d'où vient-il?

...: \

Edit:

Voici une capture d'écran où je vois l'erreur: enter image description here

La collection étudiants se révéler correcte mais ayant cette erreur là-bas effraye moi pour quand je vais pousser une application sur le marché des applications.

Si cela aide j'utilise l'émulateur pour déboguer.

EDIT: J'ajoute cette capture d'écran basée sur la réponse de Desnnis.

enter image description here

+0

Il n'y a rien de mal avec le code. Je l'ai juste essayé dans un nouveau projet WP7 et ça a bien fonctionné. L'application se ferme-t-elle ou continue-t-elle sans aucun résultat? – keyboardP

+0

J'ai édité le poste basé sur les réponses pour montrer plus de détails. L'application fonctionne bien, je pense juste que cela va déclencher des problèmes bizarres plus tard. Je voulais juste voir si quelqu'un d'autre le faisait fonctionner et en même temps a la même erreur ?! – asuciu

+1

Ce message est plus susceptible de faire avec le débogueur lui-même que votre application. Si ça marche bien, ça devrait aller. – keyboardP

Répondre

1

d'abord ajouter une référence à System.Linq dans l'en-tête de classe. Comme dans:

using System.Linq; 

Le problème dans votre cas est que vous définissez le point d'arrêt au début de la boucle foreach quand rien n'est sélectionné. Créez une action à l'intérieur de la boucle et définissez un point d'arrêt à cet endroit. Vous verrez que les valeurs auront une instance Student.

+0

System.Linq est dans le projet par défaut à partir de quand j'ai créé la nouvelle application Windows Phone 7. J'ai mis à jour le code pour que vous puissiez voir toutes les références dans le projet. J'ai également ajouté une capture d'écran de ce dont je parle. – asuciu

+0

Je sais depuis le très bon début que l'étudiant travaille et il montre les bonnes propriétés, mais je veux savoir pourquoi je reçois ce message d'erreur sur le test, comme je l'ai souligné dans ma capture d'écran. – asuciu

+1

Ce que je dis est - définir un point d'arrêt * à l'intérieur de la boucle * au cours de l'itération. La condition foreach est atteinte une fois, le reste se passe dans la boucle. –

Questions connexes