2012-03-12 34 views
14

如果我有一個字符串,像這樣:轉換查詢字符串鍵值對在.net

"Name=Irwin&Home=Caribbean&Preference=Coffee" 

有沒有在C#中的方法,可以將其轉換成類似的Request.QueryString一個鍵值對?

+0

這是有幫助嗎? http://stackoverflow.com/questions/68624/how-to-parse-a-query-string-into-a-namevaluecollection-in-net – MyDaftQuestions 2014-03-12 13:02:18

回答

32

您可以嘗試使用HttpUtility.ParseQueryString

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

不需要新建NVC,因爲'ParseQueryString'已經返回該類型。 – Oded 2012-03-12 15:33:56

+0

@打完了,你說的對,我的錯。謝謝。 – Brandon 2012-03-12 15:35:47

+0

但afaik它不是客戶資料的一部分,這可能是一個問題。 (在我發現ASP.NET標籤之前發佈)。 – 2012-03-12 15:44:09

1

你應該能基礎上,與號拆分此字符串和等號,然後喂每一個到一個新的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]); 
} 

這很簡單,並對字符串的格式作了很多假設,但它適用於您的示例。

15

而現在,最長的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); 

但要注意,如果有具有相同名稱的多個鍵,它會拋出。

如果你想保護自己免受此插件:

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

之前的.ToDictionary(和.Select後)

這將採取多者的第一key=value。將.First()更改爲.Last()以取最後一個。

+0

+1在我的情況下,比我接受的解答更有幫助,因爲我正在尋找解析style = string = key的情況:value [; key:value] ... – 2012-09-27 20:14:17

+0

實際上,這並不是所有的那麼長時間LINQ表達式:-p。另外,如果這真的打算解析類似查詢的字符串,那麼對['Uri.UnescapeDataString()']的調用(https://msdn.microsoft.com/zh-cn/library/system.uri .unescapedatastring%28V = vs.110%29.aspx)? – binki 2016-03-07 18:57:52

+1

@binki你是對的(在第二個):-)增加...在長度上,後代將決定:-) – xanatos 2016-03-07 19:37:59

4

您也可以使用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

如果你不想依賴於System.Web,這就是要走的路,例如如果您正在開發一個輸入或輸出查詢字符串格式的API。 – 2016-08-08 14:42:36