Od https://stackoverflow.com/a/25164964/1033581:
- dotknięciem # w Uri
- obsługi możliwą wartość brakującego jak & name = w Uri
- nie zapominając
Uri.UnescapeDataString
- powrocie a
Dictionary
zamiast IEnumerable
więc można znaleźć żądany parametr łatwo
do telefonu 7 urządzeń systemu Windows (lub masz tylko łańcuch, a nie Uri, a potem po prostu zastąpić uri.OriginalString
z ciągiem),
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>();
}
Uwaga: na urządzeniu z systemem Windows Phone 7, Uri.Query
jest niewiarygodne dla Uri, takie jak "mailto: [email protected]? Subject = subject & body = body". Dlatego używamy Uri.OriginalString
.
dla telefonów urządzenia Windows 8 i masz uri, można zoptymalizować w ten sposób,
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>();
}
Jeśli chcesz wiedzieć, czy jesteś na urządzeniu z systemem Windows Phone 8 za pomocą telefonu Windows 7 aplikacji:
public static readonly bool IsVersion8 = Environment.OSVersion.Version >= new Version(8, 0);
http://stackoverflow.com/questions/10936266/how-to-break-apart-a-uri-in-wp7 –