2010-06-08 1 views
1

J'ai une chaîne comme ceci:
"user = U123; name = test; lastname = Utilisateur"Comment pouvez-vous changer un ";" chaîne séparée à une sorte de dictionnaire?

Je veux obtenir un dictionnaire pour cette chaîne comme ceci:

user  "u123" 
name  "Test" 
lastname "User" 

cette façon, je peut facilement accéder aux données dans la chaîne.

Je veux le faire en C#.

EDIT:
C'est ce que j'ai jusqu'à présent:

public static Dictionary<string, string> ValueToDictionary(string value) 
{ 
    Dictionary<string, string> result = null; 

    result = new Dictionary<string, string>(); 
    string[] values = value.Split(';'); 

    foreach (string val in values) 
    { 
     string[] valueParts = val.Split('='); 
     result.Add(valueParts[0], valueParts[1]); 
    } 

    return result; 
} 

Mais pour être honnête, je pense vraiment qu'il ya une meilleure façon de le faire.

Cheers, M.

+4

Ça ne va pas aller mieux que ce que vous avez maintenant. À ce moment, les réponses ci-dessous sont toutes beaucoup plus difficiles à lire que votre propre code. La seule vraie amélioration que vous pourriez faire est de le rendre plus rapide (au prix de le rendre encore plus illisible que les réponses actuelles), mais il n'a probablement pas besoin d'être plus rapide? – Joren

+5

Votre code est bon et lisible, je préfère cette solution sur n'importe quelle solution LINQ. – RvdK

+1

Comme vous avez vu la plupart des solutions utilisent split. Une pensée m'a cependant traversé l'esprit, pouvez-vous garantir qu'il n'y aura pas d'espace disponible? Si tel est le cas, vous devrez ajouter une logique de découpage ou envisager de regex – Simon

Répondre

2

diviser la chaîne par ";".

Effectuez une itération sur chaque élément du tableau résultant et divisez chaque élément par "=".

Maintenant; dictionary.add (élément [0], élément [1]);

J'espère que je l'ai fait assez clair.

1
var dictionary = new Dictionary<string, string>(); 
var linedValue = "user=u123;name=Test;lastname=User"; 
var kvps = linedValue.Split(new[] { ';' }); // you may use StringSplitOptions.RemoveEmptyEntries 
foreach (var kvp in kvps) 
{ 
    var kvpSplit = kvp.Split(new[] { '=' }); 
    var key = kvpSplit.ElementAtOrDefault(0); 
    var value = kvpSplit.ElementAtOrDefault(1); 
    dictionary.Add(key, value); 
    // you may check with .ContainsKey if key is already persistant 
    // you may check if key and value with string.IsNullOrEmpty 
} 
1
Dictionary<string, string> d = new Dictionary<string, string>(); 
string s1 = "user=u123;name=Test;lastname=User"; 
foreach (string s2 in s1.Split(';')) 
{ 
    string[] split = s2.Split('='); 
    d.Add(split[0], split[1]); 
} 
3

Vous pouvez utiliser LINQ:

var text = "user=u123;name=Test;lastname=User"; 
var dictionary = (from t in text.Split(";".ToCharArray()) 
        let pair = t.Split("=".ToCharArray(), 2) 
        select pair).ToDictionary(p => p[0], p => p[1]); 
0

Si vous êtes sûr qu'il n'y a pas les caractères de séparation dans vos données d'entrée, les travaux suivants

string input = "user=u123;name=Test;lastname=User"; 
string[] fragments = input.Split(";=".ToArray()); 
Dictionary<string,string> result = new Dictionary<string,string>() 
for(int i=0; i<fragments.Length-1;i+=2) 
    result.Add(fragments[i],fragments[i+1]); 

Il pourrait effectuer un peu mieux que certaines des autres solutions, car elle n'appelle Split() qu'une seule fois. Habituellement j'irais pour l'une des autres solutions ici, surtout si la lisibilité du code est de quelque valeur pour vous.

0

Je pense que je le ferais comme ça ...

String s = "user=u123;name=Test;lastname=User"; 
Dictionary<string,string> dict = s.ToDictionary(); 

La mise en œuvre de ToDictonary est le même que le vôtre, sauf que je le mettre en œuvre en tant que extension method. Cela a l'air plus naturel.

Questions connexes