Проанализировать строку с парами имя-значение

Как я могу проанализировать следующую строку пары имя-значение в С#:

string studentDetail = "StudentId=J1123,FirstName=Jack,LastName=Welch,StudentId=k3342,FirstName=Steve,LastName=Smith"

Цель анализа этого массива - вставить значения в DB с использованием Linq в SQL:

    [HttpPost()]
    public ActionResult SaveStudent(string studentDetail)
    {
        DataContext db = new DataContext();         

                Student student = new Student();
                {
                    student.StudentID = //StudentID
                    student.FirstName = //FirstName
                    student.LastName = //LastName

                };

                db.Student.InsertOnSubmit(student);
                db.SubmitChanges();

            return View();
    }

Каков наилучший способ приблизиться к этому?

Ответ 1

Вы можете разделить на запятую, а затем на знак равенства. Я поместил данные в словарь для легкого доступа.

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"];

Обратите внимание, что это вовсе не проверяет ввод, чтобы гарантировать отсутствие запятых в значениях, ключей без значений, пропущенных ключей и т.д.

Ответ 2

Поскольку отдельные записи студентов не ограничены во входных данных, я бы сделал следующее:

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

а затем:

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;
}

Опять же, это немного наивно, потому что если контент содержит "=", "," или "|", будут сбои. Вы также должны добавить некоторые проверки.

Ответ 3

string sourceStr= "StudentId=J1123,FirstName=Jack,LastName=Welch,StudentId=k3342,FirstName=Steve,LastName=Smith";

Dictionary<string,string> names=new Dictionary<string,string>();
string[] arr = sourceStr.Split(',');         
foreach (var ar1 in arr)
{
    string[] itemArr= ar1.Split('=');
    if (itemArr.Length > 1)
    {
        names.Add(itemArr[0], itemArr[1]);
    }
}
//check names now

Ответ 4

Эрик Петроэлье очень хорошо ответил на fooobar.com/info/424004/...

Попробуйте System.Web.HttpUtility.ParseQueryString, проходя мимо всего после вопроса знак. Вам нужно будет использовать System.Web сборку, но для этого не требуется веб-контекст.

(Я не уверен, почему эти два вопроса не связаны)

Мне удалось проанализировать строку формы a = 1 & b = 2 & c = 3, используя следующий код

NameValueCollection nameValueCollection = HttpUtility.ParseQueryString(submission);