using System.Collections.Specialized;
public static string[] QueryStringOmissions = new string[] { "b" };
public static NameValueCollection SortAndRemove(NameValueCollection collection)
var orderedKeys = collection.Cast<string>().Where(k => k != null).OrderBy(k => k);
var newCollection = HttpUtility.ParseQueryString(String.Empty);
foreach(var key in orderedKeys)
if (!QueryStringOmissions.Contains(key))
foreach(var val in collection.GetValues(key).Select(x => x).OrderBy(x => x).ToArray())
newCollection.Add(key, val);
public static Uri SortRemoveQueryStrings(Uri uriResult)
var qs = HttpUtility.ParseQueryString(uriResult.Query);
uriResult = new UriBuilder(uriResult) { Query = SortAndRemove(qs).ToString() }.Uri;
public static void Main()
var a = new Uri("http://example.com?a=1&d=5&c=3&b=2&a=4");
var b = new Uri("http://example.com?d=5&a=4&c=3&b=2&a=1");
var aFixed = SortRemoveQueryStrings(a);
var bFixed = SortRemoveQueryStrings(b);
Console.WriteLine(aFixed);
Console.WriteLine(bFixed);
Console.WriteLine(aFixed.Equals(bFixed));