parse a string with name-value pairs

Eric Petroelje had a very nice answer at https://stackoverflow.com/a/2049079/59996

Try System.Web.HttpUtility.ParseQueryString, passing in everything after the question mark. You would need to use the System.Web assembly, but it shouldn't require a web context.

(I'm not sure why these two questions aren't linked)

I was able to parse a string of the form a=1&b=2&c=3 using the following code

NameValueCollection nameValueCollection = HttpUtility.ParseQueryString(submission);

You can split on the comma, then on the equals sign. I put the data into a dictionary for easy access.

string input = "StudentId=J1123,FirstName=Jack,LastName=Welch";

Dictionary<string,string> keyValuePairs = input.Split(',')
  .Select(value => value.Split('='))
  .ToDictionary(pair => pair[0], pair => pair[1]);

string studentId = keyValuePairs["StudentId"];

Note that this isn't validating the input at all to ensure that there are no commas in values, no keys without values, missing keys, etc.


Because the individual student records are not delimited in the input, I would do something like the following:

public class Student
{
    public string Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
} 

and then:

private List<Student> DoSplit(string input)
{
    var theReturn = new List<Student>();
    input = input.Replace(",StudentId=", "|,StudentId=");

    var students = input.Split('|');

    foreach (var student in students)
    {
        var attribs = student.Split(',');
        if (attribs.Count() == 3)
        {
            var s = new Student();
            s.Id = attribs[0].Substring(attribs[0].LastIndexOf('='));
            s.FirstName = attribs[1].Substring(attribs[1].LastIndexOf('='));
            s.LastName = attribs[2].Substring(attribs[2].LastIndexOf('='));

            theReturn.Add(s);
        }
    }

    return theReturn;
}

Again, it's a bit naive because if content contains "=", ",", or "|", there will be failures. You should add some checking in there as well.