2009-04-22 35 views
48

Tôi đang tìm cách chuyển đổi chuỗi truy vấn đơn giản nhất từ ​​yêu cầu HTTP GET sang từ điển và ngược lại.Cách tốt nhất để chuyển chuỗi truy vấn thành từ điển trong C#

Tôi thấy việc thực hiện các thao tác khác nhau trên truy vấn một khi nó ở dạng từ điển dễ dàng hơn, nhưng tôi dường như có rất nhiều mã chỉ để thực hiện chuyển đổi. Bất kỳ cách nào được khuyến nghị?

Trả lời

13

Làm thế nào về HttpUtility.ParseQueryString?

Chỉ cần thêm một tham chiếu đến System.Web.dll

+0

Không có trong Silverlight :-(Sao chép/dán - ở đây tôi đi ... – mark

60

HttpUtility.ParseQueryString() phân tích chuỗi truy vấn vào một đối tượng NameValueCollection, chuyển đổi sau này đến một IDictionary<string, string> là một vấn đề của một đơn giản foreach. Tuy nhiên, điều này có thể không cần thiết vì NameValueCollection có trình chỉ mục, vì vậy nó hoạt động khá giống với từ điển.

+0

và ngược lại: http://stackoverflow.com/questions/829080/how-to-build-a-query-string-for-a-url-in-c – Rudi

+12

Request.QueryString đã là một NameValueCollection, @ H70 câu trả lời là dễ nhất để đưa vào một từ điển 'var parameters = Reque st.QueryString.Keys.Cast () .ToDictionary (k => k, v => Request.QueryString [v]); ' –

9

Chỉ cần phải làm điều này cho một giải pháp tương thích mono

Regex.Matches(queryString, "([^?=&]+)(=([^&]*))?").Cast<Match>().ToDictionary(x => x.Groups[1].Value, x => x.Groups[3].Value) 
+0

Làm việc cho Windows Phone 8 quá (' HttpUtility.ParseQueryString' không tồn tại ở đó). – nemesisfixx

+1

. . . và hy vọng để địa ngục chìa khóa của bạn ('Nhóm [1]') là duy nhất. –

+0

@BinaryWorrier và nếu chúng không đơn giản .GroupBy (x => x.Groups [1] .Value) .ToDictionary (g => g.Key, g => g.First(). Groups [3]. Giá trị); sẽ hoạt động (với mất dữ liệu rõ ràng) – drake7707

5

Tôi thích ngắn gọn của Jon Canning's answer, nhưng vì lợi ích của đa dạng, đây là một sự thay thế cho câu trả lời của mình, điều đó cũng sẽ làm việc cho các môi trường hạn chế như Windows Phone 8, mà thiếu HttpUtility.ParseQueryString() tiện ích:

public static Dictionary<string, string> ParseQueryString(String query) 
    { 
     Dictionary<String, String> queryDict = new Dictionary<string, string>(); 
     foreach (String token in query.TrimStart(new char[] { '?' }).Split(new char[] { '&' }, StringSplitOptions.RemoveEmptyEntries)) 
     { 
      string[] parts = token.Split(new char[] { '=' }, StringSplitOptions.RemoveEmptyEntries); 
      if (parts.Length == 2) 
       queryDict[parts[0].Trim()] = HttpUtility.UrlDecode(parts[1]).Trim(); 
      else 
       queryDict[parts[0].Trim()] = ""; 
     } 
     return queryDict; 
    } 

trên thực tế, một sự cải thiện hữu ích cho câu trả lời Canning rằng chăm sóc giá trị url-mã hóa giải mã (như trong các giải pháp trên) là:

public static Dictionary<string, string> ParseQueryString2(String query) 
    { 
     return Regex.Matches(query, "([^?=&]+)(=([^&]*))?").Cast<Match>().ToDictionary(x => x.Groups[1].Value, x => HttpUtility.UrlDecode(x.Groups[3].Value)); 
    } 
22

Sau đây là cách tôi thường làm điều đó

Dictionary<string, string> parameters = HttpContext.Current.Request.QueryString.Keys.Cast<string>() 
       .ToDictionary(k => k, v => HttpContext.Current.Request.QueryString[v]); 
+0

Dễ dàng và đơn giản!Cần một +1 :-) – Matt

+0

cho câu trả lời thanh lịch – mzonerz

2

Một lót mà không HttpUtility

var dictionary = query.Replace("?", "").Split('&').ToDictionary(x => x.Split('=')[0], x => x.Split('=')[1]); 
+0

Mã của bạn sẽ tạo Ngoại lệ khi kết thúc ("&") – Adrian

+0

ok, tôi chưa từng nghĩ về trường hợp sử dụng đó. Bạn có thể thêm '.Where (x =>! String.IsNullOrEmpty (x))' trước '.ToDictionary' để tránh ngoại lệ đó – vicentedealencar

+0

Bạn chỉ cần thêm tham số StringSplitOptions.RemoveEmptyEntries vào .Split ('&'): .Split (new [] {'&'}, StringSplitOptions.RemoveEmptyEntries) –

4

Tuy nhiên, một cách khác để làm điều đó:

NameValueCollection nvcData = HttpUtility.ParseQueryString(queryString); 
Dictionary<string, string> dictData = new Dictionary<string, string>(nvcData.Count); 
foreach (string key in nvcData.AllKeys) 
{ 
    dictData.Add(key, nvcData.Get(key)); 
} 
4

Tương tự như Sean, nhưng với LINQ (và một chức năng bạn có thể sao chép và dán):

public static Dictionary<string, string> ParseQueryString(string queryString) 
{ 
    var nvc = HttpUtility.ParseQueryString(queryString); 
    return nvc.AllKeys.ToDictionary(k => k, k => nvc[k]); 
} 

Ngoài ra, câu hỏi hỏi làm thế nào để có được nó trở lại vào một chuỗi truy vấn:

public static string CreateQueryString(Dictionary<string, string> parameters) 
{ 
    return string.Join("&", parameters.Select(kvp => 
     string.Format("{0}={1}", kvp.Key, HttpUtility.UrlEncode(kvp.Value)))); 
} 
0

đơn giản nhất:

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

for (int i = 0; i < context.Request.QueryString.Count; i++) 
{ 
    parameters.Add(context.Request.QueryString.GetKey(i), context.Request.QueryString[i]); 
} 
+0

Thêm mô tả vào phân đoạn mã của bạn, Chỉ khối mã sẽ không giúp được gì nhiều. – Billa

Các vấn đề liên quan