2014-09-11 2 views
2

Это, наверное, очень простой вопрос, но google позволил мне спуститься и продолжает указывать мне на решения python.Вставить все ключи в словаре в верхний регистр

У меня есть веб-страницу, где applciations/пользователи могут поставлять querystringparameters .Чтобы Извлечение параметров строки запроса, которые я использую следующий код:

IDictionary<string, string> qStrings = HtmlPage.Document.QueryString; 

, чтобы проверить наличие указанного ключа, я использую следующий код:

if (!String.IsNullOrEmpty(qStrings["PARAM1"])) 
{} 

Зная наши пользователи, я жду их, чтобы дать parameterkeys следующим образом: «param1», «param1», «param1» Как можно просто бросить каждый ключ в словаре в верхний регистр без перебора каждого ключа valuepair ?

Или как я могу изменить qStrings["PARAM1"], чтобы он игнорировал случай?

+2

Не делайте 'String.IsNullOrEmpty (QStrings [ "PARAM1"])', что приведет к краху если 'PARAM1' не существует. То, что вы должны сделать, это 'if (qStrings.TryGetValue (« PARAM1 », out param1)) {...}' – Alxandr

+0

@Alxandr, спасибо, вы просто сохранили мне много поддержки :) – User999999

+0

Обратите внимание, что 'param1' может быть «пустым» или пустой строкой, хотя, возможно, вы захотите проверить, что внутри '{...}' – Alxandr

ответ

6

Вы можете использовать StringComparer найти ключи, игнорируя их случай:

var qStrings = new Dictionary<string, string>(
    HtmlPage.Document.QueryString, 
    StringComparer.OrdinalIgnoreCase) 
+0

Протестировано и подтверждено, что оно работает! – User999999

+3

Устанавливает, что это приведет к сбою, если в строке запроса есть парам и парам1. Вы могли бы как-то защититься от этого. – Alxandr

+0

@Alxandr, Снова вы делаете очень хороший момент. Я добавил чек на мой код! – User999999

-1

Без перебора не представляется возможным. Независимо от того, какой подход вы используете, будет какая-то итерация. Это вам необходимо ограничить ввод данных в единый унифицированный корпус, а не позволять пользователям вводить все виды корпусов.

Взяв ваш пример: "Param1", "param1", "pArAm1", ключ будет создан для каждого из них, поскольку они рассматриваются как отдельные объекты. Лучший способ справиться с этим - заставить корпус при вставке, а не при запросе значений.

Например:

void AddToDictionary(string key, string value) 
{ 
    qStrings[key.ToUpper()] = value; 
} 
+0

Как указано в другом ответе (http://stackoverflow.com/a/25781046/336648), вы можете игнорировать случай при поиске ключей в словаре. – Kjartan

+0

@Kjartan, но это только вызовет проблему, поскольку у вас будет несколько записей с одним и тем же ключом, но с другим корпусом –

+0

@RedSerpent: просто проверил его. Даже при использовании другого корпуса исключение возникает при добавлении дважды одного и того же ключа. поэтому проблем нет :) – User999999

1

Может быть, вы можете сделать это, как показано ниже:

Dictionary<string, string> qStrings = new Dictionary<string, string>(); 
foreach (var a in qStrings.Keys) 
{ 
    switch (a.ToUpper()) 
    { 
     case "PARAM1": 
      break; 
    } 
} 
+0

Ваше решение может/должно работать (не проверял его).Но решения takemyoxygen больше соответствуют существующему коду (+1 хотя) – User999999

 Смежные вопросы

  • Нет связанных вопросов^_^