解析具有名称 - 值对的字符串

use*_*468 12 c# asp.net-mvc parsing linq-to-sql

如何在C#中解析以下名称 - 值对的字符串:

string studentDetail = "StudentId=J1123,FirstName=Jack,LastName=Welch,StudentId=k3342,FirstName=Steve,LastName=Smith"
Run Code Online (Sandbox Code Playgroud)

解析此数组的目的是使用Linq to SQL在DB中插入值:

    [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();
    }
Run Code Online (Sandbox Code Playgroud)

接近这个的最佳方法是什么?

Ser*_*rvy 43

您可以在逗号上拆分,然后在等号上拆分.我将数据放入字典中以便于访问.

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"];
Run Code Online (Sandbox Code Playgroud)

请注意,这根本不验证输入,以确保值中没有逗号,没有值没有键,缺少键等.

  • 所有这些时间,我从来不知道ToDictionary有一个超载,它带走了关键和价值观. (2认同)
  • 由于键在字符串中出现多次而导致重复键异常。 (2认同)
  • 该答案不适用于问题的原始数据。`System.ArgumentException: '已添加具有相同键的项目。密钥:学生ID'` (2认同)

Jon*_*han 5

由于单个学生记录未在输入中分隔,因此我会执行以下操作:

public class Student
{
    public string Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
} 
Run Code Online (Sandbox Code Playgroud)

进而:

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;
}
Run Code Online (Sandbox Code Playgroud)

同样,这有点幼稚,因为如果内容包含“=”、“、”或“|”,则会出现故障。您还应该在那里添加一些检查。

  • 这是正确的答案,实际上回答了 OP 问题。 (2认同)