views:

21

answers:

1

I have the code below.

The line string content = twitterMsg.text; is creating the error 'Use of unassigned local variable' for twitterMsg. I don't seem able to access my TwitterSearchResponse.results.text fields in my DataContractJsonSerializer<TwitterMain> collection.

TwitterSearchResponse.results is an array (set of object properties) with several string fields attached with names like text and user_info.

Can anyone help with this??

Updated code below. I am still highly confused about why I am not able to iterate over my TwitterSearchResponse.results properly and assign content = twitterMsg.text

For what it's worth, here is my DataContractJsonSerializer method:

String url = String.Format("http://search.twitter.com/search.json?q={0}&amp;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
}

And here is the original posted code where the issue lies.

    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;
}
+2  A: 

I suspect it's actually reporting the use of the unassigned local variable MessageLinks. Your use of twitterMsg looks fine.

So, the big question is: what do you want to return if there aren't any results? If you're happy returning null, just assign the value when you declare MessageLinks.

Next question: do you really only want to return the last MatchCollection you find? That's what the current behaviour is: you're looping over all the variables, setting the same local variable each time (i.e. replacing the previous value) and then returning that last value.

Final question: any reason why you've got a camel-cased method name (returnMatches), a Pascal-cased local variable (MessageLinks), a Pascal-cased parameter name (TwitterSearchResponse) and a camel-cased property (text)? I would assume that text is due to it coming from JSON that way - but it's a good idea to follow normal .NET naming conventions otherwise.

Jon Skeet
@Jon Skeet - I seem to have my own notation that is almost certainly not so useful. Thanks, I understand the issue now and will make sure I keep good formatting from now on!
AlexW
@ Jon Skeet - actually I have used `public List<MatchCollection> returnMatches(DataContractJsonSerializer<TwitterMain> TwitterSearchResponse)` to get all MatchCollections, but twitterMsg is still not getting access to it's data.
AlexW
@AlexW: Please post the *actual code* - omitting the pattern if necessary, of course. Your currently posted code would *not* lead to the error message you posted.
Jon Skeet
@Jon Skeet - updated, hope it helps.
AlexW
Ok it's fine now, I ran the debugger and it cleared itself up somehow.
AlexW