2012-05-03 14 views
7

Bir url'den sorgu dizesi parametresi ayıklamak için gereken bir sorunum var. Parametre, "Territory" veya "territory" veya bu kelimenin diğer üst/küçük harf varyasyonları olabilir. Her ne kadar ilk iki vaka için aşağıdakiler işe yararsa da, daha iyi bir yol olup olmadığını merak ediyorum. kullanıcı yanlışlıkla bu kod başarısız olur "TERRITORY" yazdıysanızBüyük/küçük harf sorgu dizelerini denetlemenin en iyi yolu

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

Ben Sözlük görmezden durumda içine sorgu dizesi (eklemek için tercih ediyorum yani. yüzden sadece test edebilirsiniz nasıl kelime olursa olsun kasanın varolduğunu?

+0

Bu size yardımcı olabilir. Anahtarı queryString nesnesinden alın. Küçük bir duruma dönüştürün ve sonra "bölge" ile karşılaştırın. Bu şekilde kasa hakkında endişelenmenize gerek kalmayacaktı. – Krishna

+0

@Krishna: Ve onun anahtarını (eğer her anahtar ile yinelenen yanı sıra) bilmiyorsanız, queryString nesnesinden anahtarın tam olarak nasıl elde edilebilir? – Cameron

+0

@Cameron - Açıkladığınız için teşekkür ederiz. Tam olarak benim sorunum! – rmcsharry

cevap

14

küçük harf duyarlı bir anahtar karşılaştırıcısı bir sözlük kullanın:

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

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

Uyarı: InvariantCultureIgnoreCase'in tehlikeli bir seçim olduğuna inanıyorum. OrdinalIgnoreCase güvenli bir seçimdir. InvariantCulture'ın aksanlı harfleri, aksanlı harfler ile aynı şekilde ele aldığına dair benim anlayışım. bu yüzden 'resumeID' = 'resuméID' anlamına gelir. ama OrdinalIgnoreCase'in 'resumeID' ve 'resuméID'yi farklı dizgiler olarak ele aldığını anlıyorum. Feragatname: Bunu test etmedim ve şu anda bunun için zamanım yok. Net hakkında çok bilgi kötü tavsiye ya da sadece yanlış yanlış, bu yüzden sadece bu 'bunu dikkatli olun' ve ben kesinlikle bilmiyorum. : P –

+1

@Shawn: Biliyorsunuz, 'OrdinalIgnoreCase' muhtemelen burada daha iyi bir varsayılan. Ancak, 'InvariantCultureIgnoreCase' kesinlikle 'resumeID' ve 'resuméID' eşit olarak düşünmüyor ([try it] (http://csharppad.com/gist/a1e1d956b09f1b5f52b5)!). Ben karşılaştırma sırasında sadece bir Unicode normalleştirme biçimi (inanıyorum ki, akut aksan ile e-ile-akut-vurgu karakter eşit olacak şekilde birleştiren), bu arada, 'OrdinalIgnoreCase' codepoint codepoint tarafından kontrol eder (yanlış olabilir rağmen de, heh). Daha fazla bilgi var [burada] (http://stackoverflow.com/q/2749662/21475). – Cameron

0

Merhaba ayrıca topraklarında olabilir, sorgu dizesi bir .Tolower()

+0

Querystring bir sözlüktür, üzerinde bir tolower yapamazsınız – rmcsharry

2
doQueryString Nesneniz bir sözlük nesnesi değilse, ancak bunun yerine NameValueCollection ...
IDictionary<string, string> queryString = QueryString.AllKeys.ToDictionary(k => k.ToLowerInvariant(), k => QueryString[k]); 
+0

ama querystring sadece durumda farklı 'yinelenen' tuşları içeriyorsa bu kod sonu (hata) wud? Peki bu kod, querystring 'abc = 1 & ABC = 2' olduğunda ne yapar? –

İlgili konular