来自https://stackoverflow.com/a/25164964/1033581:
- 在 Uri 中处理 #
- 处理可能的缺失值,例如 Uri 中的 &name=
- 不要忘记
Uri.UnescapeDataString
- 返回
Dictionary 而不是 IEnumerable,以便轻松找到所需的参数
对于 Windows Phone 7 设备(或者您只有一个字符串,而不是 Uri,那么只需将 uri.OriginalString 替换为您的字符串),
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>();
}
注意:在 Windows Phone 7 设备上,Uri.Query 对于像“mailto:a@example.com?subject=subject&body=body”这样的 Uri 是不可靠的。这就是我们使用Uri.OriginalString 的原因。
对于 Windows Phone 8 设备并且你有一个 Uri,你可以这样优化,
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>();
}
如果您想知道您是否在使用 Windows Phone 7 应用的 Windows Phone 8 设备上:
public static readonly bool IsVersion8 = Environment.OSVersion.Version >= new Version(8, 0);