2012-07-26 12 views
5

Come posso analizzare la seguente stringa di coppia nome-valore in C#:analizzare una stringa con coppie nome-valore

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

Lo scopo di analizzare questo array è quello di inserire i valori nel DB usando LINQ to 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(); 
    } 

Qual è il modo migliore per avvicinarsi a questo?

+2

che non è una string [] – BlackBear

+0

@BlackBear aggiornato – user793468

+0

sembra ancora solo una stringa, non uno string [] – hatchet

risposta

31

È possibile dividere la virgola, quindi il segno di uguale. Ho messo i dati in un dizionario per un facile accesso.

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

Nota che questo non sta convalidando l'ingresso a tutti per garantire che non ci sono le virgole nei valori, non le chiavi senza valori, le chiavi mancanti, ecc

+1

Tutto questo tempo e non ho mai saputo che ToDictionary avesse un sovraccarico che prendesse le chiavi e i valori. – Kivin

+0

Ottima risposta, vorresti indicarmi la soluzione per KeyValuePair invece di stringa? (O una tupla ) ?? Ho valori duplicati e ho bisogno di analizzare la mia stringa con quei duplicati disponibili. – user1970395

+0

eccezione di chiave duplicata a causa del fatto che la chiave appare più volte nella stringa. –

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

perché i singoli record degli studenti non sono delimitati nell'input, vorrei fare qualcosa di simile alla seguente:

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

e poi:

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

Ancora una volta, è un po 'ingenuo perché se il contenuto contiene "=", "," o "|", ci saranno errori. Dovresti aggiungere qualche controllo anche lì.

+1

Questa è la risposta corretta e in effetti risponde alla domanda degli OP. –

0

Eric Petroelje avuto una risposta molto bello a https://stackoverflow.com/a/2049079/59996

Prova System.Web.HttpUtility.ParseQueryString, passando tutto dopo il punto interrogativo. È necessario utilizzare l'assembly System.Web , ma non dovrebbe richiedere un contesto Web.

(io non sono sicuro perché queste due domande non sono collegate)

sono stato in grado di analizzare una stringa della forma a = 1 & b = 2 & c = 3 utilizzando il seguente codice

NameValueCollection nameValueCollection = HttpUtility.ParseQueryString(submission); 
Problemi correlati