2012-05-03 7 views
7

Tengo un problema donde necesito extraer un parámetro de cadena de consulta de una url. El parámetro podría ser "Territory" o "territory" u otras variaciones mayúsculas/minúsculas de esa palabra. Aunque lo siguiente funciona para los primeros dos casos, me pregunto si hay una mejor manera.La mejor manera de verificar cadenas de consulta de mayúsculas/minúsculas

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) 
} 

yo preferiría para insertar la cadena de consulta en el ignorando mayúsculas y minúsculas diccionario (es decir. Si el usuario accidentalmente tecleó "TERRITORY" este código fallaría, así que ¿cómo puedo simplemente probar que existe la palabra independientemente de carcasa?

+0

Esto podría ayudarlo. Obtenga la clave del objeto queryString. Convierta en una caja pequeña y luego compare con "territorio". De esta manera no tendrías que preocuparte por la carcasa. – Krishna

+0

@Krishna: ¿Y cómo exactamente se puede obtener la clave del objeto queryString, si no conoce su caso (además de repetir cada tecla)? – Cameron

+0

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

Respuesta

14

utilizar un diccionario con un comparador de claves 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. 
} 
+1

Advertencia: creo que InvariantCultureIgnoreCase es una opción peligrosa. parece que OrdinalIgnoreCase es la elección segura. Tengo entendido que InvariantCulture trata las letras acentuadas como si fueran letras sin acentos. entonces interpreto esto significa 'resumeID' = 'resuméID'. pero entiendo que OrdinalIgnoreCase trata 'resumeID' y 'resuméID' como diferentes cadenas. Descargo de responsabilidad: no he probado esto y no tengo el tiempo para hacerlo en este momento. Mucha 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. : P –

+1

@Shawn: Ya sabes, 'OrdinalIgnoreCase' es probablemente un mejor predeterminado aquí. Pero, 'InvariantCultureIgnoreCase' ciertamente no considera' resumeID' y 'resuméID' iguales ([try it] (http://csharppad.com/gist/a1e1d956b09f1b5f52b5)!). Creo que simplemente hace una forma de normalización Unicode durante la comparación (por lo tanto, e seguido de un acento agudo que combine equivaldría al carácter e-con-agudo-acento), mientras que "OrdinalIgnoreCase" verifica el punto por punto de código (aunque puedo estar equivocado también, heh). Hay más información [aquí] (http://stackoverflow.com/q/2749662/21475). – Cameron

0

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

+0

Querystring es un diccionario, no se puede hacer un tolower en él – rmcsharry

2

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

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

pero se borró este código de error (error) cuando la cadena de consulta contiene claves "duplicadas" que solo difieren en el caso? Entonces, ¿qué hace este código cuando la cadena de consulta es 'abc = 1 & ABC = 2'? –

Cuestiones relacionadas