2012-03-12 12 views

Odpowiedz

32

Możesz spróbować użyć numeru HttpUtility.ParseQueryString.

var nvc = HttpUtility.ParseQueryString(yourString); 
+1

Nie ma potrzeby dodawania nowego NVC, ponieważ 'ParseQueryString' zwraca już ten typ . – Oded

+0

@Dokonany, masz rację, mój błąd. Dzięki. – Brandon

+0

Ale afaik nie jest częścią profilu klienta, może to być problem. (Wysłane zanim zauważyłem tag ASP.NET). –

1

Powinieneś móc podzielić ten ciąg na podstawie ampersandów i równa się oznaki, a następnie karmić każdy w nowej KeyValuePair:

Dictionary<string, string> myValues = new Dictionary<string,string>(); 

string[] elements = myString.Split('=','&'); 

for(int i=0;i<elements.Length; i+=2) 
{ 
    myValues.Add(elements[i], elements[i+1]); 
} 

Jest to uproszczone i zawiera wiele założeń dotyczących formatu ciągu znaków, ale działa na Twój przykład.

15

A teraz, po najdłuższym wyrażeniu LINQ ...

var dict = "Name=Irwin&Home=Caribbean&Preference=Coffee" 
    .Split('&') 
    .Select(p => p.Split('=')) 
    .ToDictionary(p => p[0], p => p.Length > 1 ? Uri.UnescapeDataString(p[1]) : null); 

Ale należy pamiętać, że będzie rzucać jeśli istnieje wiele klucze o tej samej nazwie.

Jeśli chcesz chronić siebie od tego dodatku:

.GroupBy(p => p[0]).Select(p => p.First()) 

tuż przed .ToDictionary (i po .Select)

to zajmie pierwsze key=value z wieloma z nich. Zmień .First() na .Last(), aby wziąć ostatni.

+0

+1 W moim przypadku bardziej przydatne niż zaakceptowana odpowiedź, ponieważ szukam przypadku parsowania stylu = ciąg klucza: wartość [; klucz: wartość] ... –

+0

Właściwie to nie jest tak długo Wyrażenie LINQ: -p. Ponadto, jeśli to naprawdę miało zamiar parsować łańcuch podobny do zapytania, gdzie są wywołania do ['Uri.UnescapeDataString()'] (https://msdn.microsoft.com/en-us/library/system.uri .unescapedatastring% 28v = vs.110% 29.aspx)? – binki

+1

@binki Masz rację (na drugim) :-) Dodano ... O długości decyduje potomność :-) – xanatos

4

Można również użyć() metoda ToDictionary:

var input = "Name=Irwin&Home=Caribbean&Preference=Coffee"; 
var items = input.Split(new[] { '&' }); 
var dict = items.Select(item => item.Split(new[] {'='})).ToDictionary(pair => pair[0], pair => pair[1]); 
+0

To jest droga, jeśli nie chcesz mieć zależności od System.Web, np jeśli pracujesz nad interfejsem API, który wprowadza lub wyprowadza format podobny do kwerendy. –