Для изолированных проектов, где зависимости должны быть сведены к минимуму, я обнаружил, что использую эту реализацию:
var arguments = uri.Query
.Substring(1) // Remove '?'
.Split('&')
.Select(q => q.Split('='))
.ToDictionary(q => q.FirstOrDefault(), q => q.Skip(1).FirstOrDefault());
Должен заметить, что я не обрабатываю закодированные строки любого типа, так как я использовал это в контролируемой среде, где проблемы с кодированием были бы ошибкой кодирования на стороне сервера, которая должна быть исправлена.