2012-07-26 8 views
5

¿Cómo puedo analizar la siguiente cadena de nombre-valor par en C#:analizar una cadena con pares nombre-valor

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

El propósito de analizar esta matriz es insertar valores en DB usando Linq a 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(); 
    } 

¿Cuál es la mejor manera de abordar esto?

+2

Eso no es una cadena [] – BlackBear

+0

@BlackBear actualizado – user793468

+0

todavía se ve como simplemente una cadena, no una cadena [] – hatchet

Respuesta

31

Puede dividir la coma, luego en el signo de igual. Puse los datos en un diccionario para facilitar el acceso.

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

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

string studentId = keyValuePairs["StudentId"]; 

Tenga en cuenta que esto no es validar la entrada en absoluto para asegurar que no hay comas en los valores, no hay llaves sin valores, claves que faltan, etc.

+1

Todo este tiempo y nunca supe que ToDictionary tenía una sobrecarga que tomaba las claves y los valores. – Kivin

+0

Gran respuesta, ¿me señalarías la solución para KeyValuePair en lugar de string? (O un Tuple ) ?? Tengo valores duplicados y necesito analizar mi cadena con esos duplicados disponibles. – user1970395

+0

excepción de clave duplicada debido a que la clave aparece varias veces en la cadena. –

1
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 
2

Debido a que los registros de los estudiantes individuales no están delimitados en la entrada, me gustaría hacer algo como lo siguiente:

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

y luego:

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

Una vez más, es un poco ingenuo porque si el contenido contiene "=", "," o "|", habrá fallas. También debería agregar alguna verificación allí.

+1

Esta es la respuesta correcta y en realidad responde la pregunta de OPs. –

0

Eric Petroelje tuvieron una respuesta muy agradable en https://stackoverflow.com/a/2049079/59996

Trate System.Web.HttpUtility.ParseQueryString, pasando en todo lo después del signo de interrogación. Debería usar el ensamblado System.Web , pero no debería requerir un contexto web.

(No estoy seguro de por qué estas dos preguntas no están vinculadas)

que era capaz de analizar una cadena de la forma a = 1 b = 2 & & c = 3 usando el siguiente código

NameValueCollection nameValueCollection = HttpUtility.ParseQueryString(submission); 
Cuestiones relacionadas