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也用于代码中的其他地方。

如何去除气味?

C#:比结合StartsWith和两个ToUpperInvariant调用更好的方法

您可以使用重载的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);
}

如果您愿意,可以添加空检查。

相关文章:
  • 没有找到相关文章