2010-11-10 9 views
25

Mam ciąg formatu "klucz1 = wartość1; klucz2 = wartość2; klucz3 = wartość3;"Konwertuj wyodrębniony ciąg na słownik <ciąg, ciąg> w C#

Potrzebuję przekonwertować go do słownika dla wyżej wymienionych par wartości klucza.

Jaki byłby najlepszy sposób na rozwiązanie tego problemu? Dzięki.

+6

To jest w zasadzie kopią tego pytania: http://stackoverflow.com/questions/776107/best-way-to-convert- query-string-to-dictionary-in-c Przypuszczam, że musiałbyś zamienić ';' na '&', zanim to by działało. –

Odpowiedz

5

Możesz napisać to w ten sposób lub wykonać pętlę, aby zrobić to sam. Tak czy inaczej. Ostatecznie dzielisz się na ;, aby uzyskać pary przedmiotów, a następnie =, aby uzyskać klucz i wartość.

string input = "key1=value1;key2=value2;key3=value3;"; 
Dictionary<string, string> dictionary = 
    input.TrimEnd(';').Split(';').ToDictionary(item => item.Split('=')[0], item => item.Split('=')[1]); 

wersja Loop:

Dictionary<string, string> dictionary = new Dictionary<string, string>(); 
string[] items = input.TrimEnd(';').Split(';'); 
foreach (string item in items) 
{ 
    string[] keyValue = item.Split('='); 
    dictionary.Add(keyValue[0], keyValue[1]); 
} 
64

coś takiego?

var dict = text.Split(new[] {';'}, StringSplitOptions.RemoveEmptyEntries) 
       .Select(part => part.Split('=')) 
       .ToDictionary(split => split[0], split => split[1]); 

Oczywiście to się nie powiedzie, jeśli założenia nie zostaną spełnione. Na przykład: IndexOutOfRangeException może zostać zgłoszony, jeśli tekst nie jest w odpowiednim formacie, a jeśli zostaną zduplikowane klucze, zostanie wygenerowany ArgumentException. Każdy z tych scenariuszy będzie wymagał różnych modyfikacji. Jeśli istnieje nadmiarowa biała przestrzeń, w razie potrzeby możesz potrzebować wywołań string.Trim.

+0

+1 dla .ToDictionary - gładka –

11

Zaktualizował Ani, aby uwzględnić półkolektor na końcu. Klauzula where zapewnia, że ​​przed utworzeniem i wprowadzeniem masz klucz i wartość.

var dictionary = "key1=value1;key2=value2;key3=value3;" 
    .Split(';') 
    .Select (part => part.Split('=')) 
    .Where (part => part.Length == 2) 
    .ToDictionary (sp => sp[0], sp => sp[1]); 
8

Oto niesamowite spacje ignorując, korygowanie ostatnia wartość posiadające lub nie posiadające moc średnik wyrażeń regularnych:

 var dict = Regex.Matches("key1 = value1; key2 = value2 ; key3 = value3", @"\s*(.*?)\s*=\s*(.*?)\s*(;|$)") 
     .OfType<Match>() 
     .ToDictionary(m => m.Groups[1].Value, m => m.Groups[2].Value); 

Ale poważnie choć Ani zasługuje rekwizyty dla .ToDictionary(). Nigdy bym o tym nie pomyślał.

5

Można to zrobić za pomocą JSON ciąg znaków, na przykład:

var dic = JsonConvert.DeserializeObject<Dictionary<int, string>>("{'1':'One','2':'Two','3':'Three'}");