La mejor manera de verificar cadenas de consulta en mayúsculas/minúsculas

Tengo un problema en el que necesito extraer un parámetro de cadena de consulta de una URL. El parámetro podría ser cualquiera "Territory" or "territory" u otras variaciones en mayúsculas/minúsculas de esa palabra. Aunque lo siguiente funciona para los dos primeros casos, me pregunto si hay una mejor manera.

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

if (queryString.ContainsKey("territory"))
{
    ish.SetDefaultRegion(int.Parse(queryString["territory"]));
    // do something (the same something as below)
}
else if (queryString.ContainsKey("Territory"))
{
    ish.SetDefaultRegion(int.Parse(queryString["Territory"]));
    // do something (the same something as above)
}

Preferiría insertar la cadena de consulta en el diccionario ignorando mayúsculas y minúsculas (es decir, si el usuario escribió accidentalmente "TERRITORY" este código fallaría, entonces, ¿cómo puedo probar que la palabra existe independientemente de las mayúsculas y minúsculas?

preguntado el 03 de mayo de 12 a las 17:05

Esto podría ayudarte. Obtenga la clave del objeto queryString. Conviértalo en caso pequeño y luego compárelo con "territorio". De esta manera no tendrías que preocuparte por la carcasa. -

@Krishna: ¿Y cómo se puede obtener exactamente la clave del objeto queryString, si no conoce su caso (además de iterar a través de cada clave)? -

@Cameron - Gracias por aclarar. ¡Ese es exactamente mi problema! -

Request.QueryString["territory"] ya no distingue entre mayúsculas y minúsculas. No importa si está en la URL como "Territorio", "territorio", "TeRrItOrY", etc. -

@Doug Eso bien puede ser cierto, pero la búsqueda de ContainerKey aún no coincidirá con "Territorio" y "TeRrItOrY"; por lo tanto, según la respuesta, al crear el Diccionario a partir de QueryString, se necesita un comparador de claves que no distinga entre mayúsculas y minúsculas. -

3 Respuestas

Utilice un diccionario con un comparador de claves que no distinga entre mayúsculas y minúsculas:

var queryParams = new Dictionary<string, string>(
    HtmlPage.Document.QueryString,
    StringComparer.InvariantCultureIgnoreCase
);

if (queryParams.ContainsKey("territory")) {
    // Covers "territory", "Territory", "teRRitory", etc.
}

contestado el 03 de mayo de 12 a las 18:05

Advertencia: creo que InvariantCultureIgnoreCase es una elección peligrosa. parece que OrdinalIgnoreCase es la opción segura. Tengo entendido que InvariantCulture trata las letras acentuadas como si fueran letras sin acento. entonces interpreto que esto significa 'resumeID' = 'resuméID'. pero entiendo que OrdinalIgnoreCase trata 'resumeID' y 'resuméID' como cadenas diferentes. Descargo de responsabilidad: no he probado esto y no tengo tiempo para hacerlo en este momento. Gran parte de la información en la red es un mal consejo o simplemente está mal, así que solo estoy publicando esto como 'ten cuidado con esto' y no estoy seguro. :PAGS - shawn kovac

@Shawn: Ya sabes, OrdinalIgnoreCase es probablemente un mejor valor predeterminado aquí. Pero, InvariantCultureIgnoreCase ciertamente no considera resumeID y resuméID ser iguales (intentalo!). Creo que simplemente hace una forma de normalización Unicode durante la comparación (por lo tanto, e seguido de un acento agudo combinado sería igual al carácter e-con-acento agudo), mientras que OrdinalIgnoreCase comprueba punto de código por punto de código (aunque también puedo estar equivocado, je). Hay algo más de información aquí. - Cameron

Si su objeto QueryString no es un objeto de diccionario, sino algo como NameValueCollection...

IDictionary<string, string> queryString = QueryString.AllKeys.ToDictionary(k => k.ToLowerInvariant(), k => QueryString[k]);

Respondido el 07 de enero de 14 a las 19:01

pero ¿se rompió este código (error) cuando la cadena de consulta contiene claves 'duplicadas' que solo difieren en mayúsculas y minúsculas? Entonces, ¿qué hace este código cuando la cadena de consulta es 'abc=1&ABC=2'? - shawn kovac

Hola, también puede ser TeRriTory, en la cadena de consulta haz un .Tolower()

contestado el 03 de mayo de 12 a las 17:05

Querystring es un diccionario, no puedes hacer un tolower en él - rmcsharry

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.