Some important optimizations from other answers:
- C # call in Uri
- handling a possible missing value of type & name = in Uri
- not forgetting
Uri.UnescapeDataString - returns
Dictionaryinstead IEnumerableto easily find the desired parameter - ,
Uri.Query WP7
Regex (, Split):
static readonly Regex QueryStringRegex1 = new Regex(@"^[^#]*\?([^#]*)");
static readonly Regex QueryStringRegex2 = new Regex(@"(?<name>[^&=]+)=(?<value>[^&=]*)");
public static Dictionary<string, string> QueryDictionary(this Uri uri)
{
return QueryStringRegex1.Match(uri.ToString())
.Groups
.Cast<Group>()
.Select(a => QueryStringRegex2.Matches(a.Value)
.Cast<Match>()
.Select(b => b.Groups)
.ToDictionary(b => Uri.UnescapeDataString(b["name"].Value), b => Uri.UnescapeDataString(b["value"].Value)))
.ElementAtOrDefault(1)
?? new Dictionary<string, string>();
}
Split ( , Regex, ):
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.ToString()
.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))
.FirstOrDefault()
?? new Dictionary<string, string>();
}
. Windows Phone 7 Uri.Query Uri, "mailto: a@example.com? subject = subject & body = body". Uri.ToString() ( , Uri.OriginalString). "(http | https)://" Windows Phone 8, fooobar.com/questions/1152295/....
Uri.Query Windows Phone 8 Windows Phone 7, :
public static readonly bool IsVersion8 = Environment.OSVersion.Version >= new Version(8, 0);