C#:比结合StartsWith和两个ToUpperInvariant调用更好的方法
本文关键字:ToUpperInvariant 两个 调用 更好 方法 结合 StartsWith | 更新日期: 2023-09-27 18:19:45
在我后脑勺的某个地方,一个微小的声音告诉我"下面的C#代码有味道"。
private const string STR_ConnectionString = "ConnectionString";
private readonly string upperCaseConnectionString = STR_ConnectionString.ToUpperInvariant();
// a lot further on
string keyAttributeValue = keyAttribute.Value;
if (keyAttributeValue.ToUpperInvariant().StartsWith(upperCaseConnectionString))
{
// some C# code handling a key that starts with "ConnectionString"
}
常数STR_ConnectionString
也用于代码中的其他地方。
如何去除气味?
您可以使用重载的StartsWith方法获取StringComparison
枚举值:
keyAttributeValue.StartsWith(STR_ConnectionString, StringComparison.OrdinalIgnoreCase) // or use StringComparison.InvariantCultureIgnoreCase here
有一个支持不区分大小写匹配的StartsWith
重载:
if (keyAttributeValue.StartsWith(STR_ConnectionString,
StringComparison.InvariantCultureIgnoreCase)
{
...
}
它还使您的代码更具可读性,因为它表达了您的意图:您真正想要的是不区分大小写的比较,这就是本文所写的内容。你并不真的想要"将值转换为大写的区分大小写的比较"。。。这只是你用来实现目标的变通方法。
如果它闻起来很难闻,因为你正在进行ToUpper然后字符串比较,那么可以使用startswith:的重载来组合它们
STR_ConnectionString..StartsWith(upperCaseConnectionString, StringComparison.CurrentCultureIgnoreCase);
但是,您似乎正在使用自己的方式来处理应用程序配置,而这是不应该做的。请参阅http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.aspx
总有
keyAttributeValue.StartsWith(STR_ConnectionString, StringComparison.InvariantCultureIgnoreCase)
但这不会像你所拥有的那样好。如果你需要每秒做数千次,坚持你所拥有的。如果没有,只需进行不区分大小写的匹配。
同时考虑
keyAttributeValue.StartsWith(STR_ConnectionString, StringComparison.OrdinalIgnoreCase)
这更快,而且可能是你想要的。
我制作了一个扩展方法,该方法使用StringComparison来忽略case,以在我的项目中处理此问题。
public static string StartsWithIgnoreCase(this string value, string startsWith)
{
return value.StartsWith(value, StringComparison.InvariantCultureIgnoreCase);
}
如果您愿意,可以添加空检查。