检查大小写查询字符串的最佳方法

7

我有一个问题,需要从URL中提取查询字符串参数。该参数可能是"Territory""territory"或该单词的其他大小写变体。虽然下面的代码可以处理前两种情况,但我想知道是否有更好的方法?

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

我希望将查询字符串插入字典中,忽略大小写(即如果用户不小心输入了"TERRITORY",这段代码将失败,那么我该如何测试单词是否存在而不考虑大小写?


这可能会对你有所帮助。从queryString对象中获取密钥。将其转换为小写,然后与“territory”进行比较。这样你就不必担心大小写问题了。 - Krishna
@Krishna:如果您不知道键的大小写(除了遍历每个键),那么如何从queryString对象中获取键呢? - Cameron
@Cameron - 谢谢您的澄清。这正是我的问题! - rmcsharry
@Doug 可能是对的,但 ContainsKey 查找仍然无法匹配 "Territory" 和 "TeRrItOrY" - 因此,根据答案,在从 QueryString 创建字典时,需要使用不区分大小写的键比较器。 - rmcsharry
@rmcsharry:为什么需要将Request.QueryString对象转换为Dictionary?如果您想知道QueryString对象中是否存在某个键,只需执行if (Request.QueryString["TeRriToRy"] != null) {即可。 - Doug S
显示剩余2条评论
3个回答

14

使用一个带有不区分大小写键比较器的字典:

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

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

1
警告:我认为InvariantCultureIgnoreCase是一个危险的选择。看起来OrdinalIgnoreCase是安全的选择。我的理解是InvariantCulture将带重音的字母视为与不带重音的字母相同。所以我理解这意味着'resumeID'='resuméID'。但我知道OrdinalIgnoreCase将'resumeID'和'resuméID'视为不同的字符串。免责声明:我没有测试过,也没有时间去测试。网络上的许多信息都是错误的建议或者完全错误的,所以我只是发布这个“小心”的提示,我不确定。 :P - Shawn Kovac
1
@Shawn:你知道,在这里OrdinalIgnoreCase可能是更好的默认值。但是,InvariantCultureIgnoreCase肯定不认为resumeIDresuméID是相等的(试一下!)。我认为它仅在比较过程中进行了一种Unicode规范化(因此,一个带有组合重音符的e将等于带有重音符的e字符),而OrdinalIgnoreCase则逐个检查代码点(虽然我也可能错了,呵呵)。这里还有更多信息链接 - Cameron

2
如果你的 QueryString 对象不是一个字典对象,而是类似于 NameValueCollection 的东西...
IDictionary<string, string> queryString = QueryString.AllKeys.ToDictionary(k => k.ToLowerInvariant(), k => QueryString[k]);

但是,如果查询字符串包含仅在大小写上不同的“重复”键,这段代码会出现错误吗?那么当查询字符串为“abc=1&ABC=2”时,这段代码会做什么? - Shawn Kovac

0

你好,它也可以是Territory,在查询字符串中执行.ToLower()方法。


查询字符串是一个字典,你不能对它执行 tolower 操作。 - rmcsharry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接