Từ https://stackoverflow.com/a/25164964/1033581:
- xử lý một # trong Uri
- xử lý giá trị thiếu khả năng như & name = trong Uri
- không quên
Uri.UnescapeDataString
- trở về a.210 thay vì một
IEnumerable
vì vậy người ta có thể tìm thấy một tham số mong muốn một cách dễ dàng
Đối với Windows Phone 7 thiết bị (hoặc bạn chỉ có một chuỗi, không phải là một Uri, sau đó chỉ cần thay thế uri.OriginalString
với chuỗi của bạn),
static readonly char[] QueryStringSeparator1 = "#".ToCharArray();
static readonly char[] QueryStringSeparator2 = "?".ToCharArray();
static readonly char[] QueryStringSeparator3 = "&".ToCharArray();
static readonly char[] QueryStringSeparator4 = "=".ToCharArray();
public static Dictionary<string, string> QueryDictionary(this Uri uri)
{
return uri.OriginalString
.Split(QueryStringSeparator1, StringSplitOptions.RemoveEmptyEntries)
.Select(a => a.Split(QueryStringSeparator2, StringSplitOptions.RemoveEmptyEntries)
.Select(b => b.Split(QueryStringSeparator3, StringSplitOptions.RemoveEmptyEntries)
.Select(c => c.Split(QueryStringSeparator4))
.Where(c => c[0].Length > 0)
.ToDictionary(c => Uri.UnescapeDataString(c[0]), c => c.Length > 1 ? Uri.UnescapeDataString(c[1]) : ""))
.ElementAtOrDefault(1))// after ?
.FirstOrDefault()// before #
?? new Dictionary<string, string>();
}
Lưu ý: trên thiết bị Windows Phone 7, Uri.Query
là không đáng tin cậy cho một Uri như "mailto: [email protected]? Subject = subject & body = body". Đó là lý do tại sao chúng tôi sử dụng Uri.OriginalString
.
Đối với Windows Phone 8 điện thoại và bạn có một Uri, bạn có thể tối ưu hóa theo cách này,
static readonly char[] QueryStringSeparator1 = "#".ToCharArray();
static readonly char[] QueryStringSeparator3 = "&".ToCharArray();
static readonly char[] QueryStringSeparator4 = "=".ToCharArray();
public static Dictionary<string, string> QueryDictionary(this Uri uri)
{
return uri.Query
.Split(QueryStringSeparator1, StringSplitOptions.RemoveEmptyEntries)
.Select(a => a.Substring(1)
.Split(QueryStringSeparator3, StringSplitOptions.RemoveEmptyEntries)
.Select(c => c.Split(QueryStringSeparator4))
.Where(c => c[0].Length > 0)
.ToDictionary(c => Uri.UnescapeDataString(c[0]), c => c.Length > 1 ? Uri.UnescapeDataString(c[1]) : ""))
.FirstOrDefault()// before #
?? new Dictionary<string, string>();
}
Nếu bạn muốn biết nếu bạn đang ở trên một Windows Phone 8 thiết bị sử dụng một điện thoại Windows 7 ứng dụng:
public static readonly bool IsVersion8 = Environment.OSVersion.Version >= new Version(8, 0);
Nguồn
2014-08-06 18:51:11
http://stackoverflow.com/questions/10936266/how-to-break-apart-a-uri-in-wp7 –