2010-06-30 5 views
0

J'ai le code ci-dessous.Accès aux propriétés DataContractJsonSerializer <T> via la boucle foreach re-factorisée

La ligne string content = twitterMsg.text; crée l'erreur 'Utilisation de variable locale non affectée' pour twitterMsg. Je ne parviens pas à accéder à mes champs TwitterSearchResponse.results.text dans ma collection DataContractJsonSerializer<TwitterMain>.

TwitterSearchResponse.resultsTwitterSearchResponse.results est un tableau (ensemble de propriétés d'objet) avec plusieurs champs de type chaîne associés à des noms tels que text et user_info.

Quelqu'un peut-il aider avec cela ??

Mise à jour du code ci-dessous. Je suis encore très confus au sujet de la raison pour laquelle je ne suis pas en mesure de parcourir mon TwitterSearchResponse.results correctement et affecter content = twitterMsg.text

Pour ce que ça vaut la peine, voici ma méthode DataContractJsonSerializer:

String url = String.Format("http://search.twitter.com/search.json?q={0}&rpp=20", Server.UrlEncode(txtSearchFor.Text)); 


// parse the JSON data 
using (MemoryStream ms = new MemoryStream(wc.DownloadData(url))) 
{ 
    DataContractJsonSerializer jsonSerializer = 
     new DataContractJsonSerializer(typeof(TwitterMain)); 
    TwitterSearchResponse = jsonSerializer.ReadObject(ms) as TwitterMain; // read as JSON and map as TwitterOut 
} 

Et voici le code affiché original où le problème réside.

public List<MatchCollection> returnMatches(DataContractJsonSerializer<TwitterMain> TwitterSearchResponse) 
{ 
     List<MatchCollection> messageLinks = new List<MatchCollection>(); 

     foreach (TwitterResult twitterMsg in TwitterSearchResponse.results) 
     { 
      string content = twitterMsg.text; 

      // capture internet protocol pre-fixed words from message 
      string pattern = @"..."; 
      messageLinks.Add(Regex.Matches(content, pattern, RegexOptions.IgnoreCase)); 

      // capture @username twitter users from message 
      string atUsernamePattern = @"@([a-zA-Z0-9-_]+)"; 
      MatchCollection PeopleMatches = Regex.Matches(content, atUsernamePattern, RegexOptions.IgnoreCase); 
     } 

     return messageLinks; 
} 
+0

J'ai supprimé mon motif «RegEx» car il faisait SO se comporter étrangement (ne me laisserais pas poster!) – Alex

Répondre

2

Je soupçonne que c'est en fait l'utilisation des rapports de la variable locale non affecté MessageLinks. Votre utilisation de twitterMsg semble bien.

Donc, la grande question est: qu'est-ce que vous voulez retourner si ne sont pas des résultats? Si vous êtes content de retourner null, attribuez simplement la valeur lorsque vous déclarez MessageLinks.

Question suivante: Voulez-vous vraiment seulement retourner le dernier MatchCollection vous trouvez? C'est ce que le comportement actuel est: vous êtes en boucle sur toutes les variables, en définissant la même variable locale à chaque fois (c'est-à-dire en remplaçant la valeur précédente) et en retournant cette dernière valeur.

Dernière question: quelle raison pour laquelle vous avez un nom de méthode en CamelCase (returnMatches), une variable locale tubé Pascal (MessageLinks), un nom de paramètre tubé Pascal (TwitterSearchResponse) et une propriété en CamelCase (text)? Je suppose que text est dû à cela venant de JSON de cette façon - mais c'est une bonne idée de suivre les conventions normales de nommage .NET autrement.

+0

Je semble avoir ma propre notation qui n'est presque certainement pas si utile. Merci, je comprends le problème maintenant et m'assurerai de garder un bon formatage à partir de maintenant! – Alex

+0

@ Jon Skeet - en fait j'ai utilisé 'public returnMatches (DataContractJsonSerializer TwitterSearchResponse)' pour obtenir toutes les MatchCollections, mais twitterMsg n'a toujours pas accès à ses données. – Alex

+0

@AlexW: S'il vous plaît poster le * code réel * - en omettant le motif si nécessaire, bien sûr. Votre code actuellement publié ne mènera pas au message d'erreur que vous avez posté. –

Questions connexes