2012-01-09 49 views
6

在我腦海中的某個地方,一個小小的聲音告訴我「下面的C#代碼有異味」。C#:比結合StartsWith和兩個ToUpperInvariant調用更好的方法

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

如何擺脫氣味?

+0

寫入擴展方法,如果這樣的驗證經常在您的代碼中。 – Samich 2012-01-09 13:51:25

+2

它味道好嗎?或者它聞起來不好?看起來對我來說很好:D – Shai 2012-01-09 13:51:54

+0

+1 @Shai我可能應該提到原始的代碼庫是.NET 1.1,但它很快就會變成.NET 4,所以我在升級到.NET 4之後已經超負荷了。 – 2012-01-09 15:37:45

回答

5

可以使用overloaded StartsWith method採取StringComparison枚舉值:

keyAttributeValue.StartsWith(STR_ConnectionString, StringComparison.OrdinalIgnoreCase) // or use StringComparison.InvariantCultureIgnoreCase here 
+0

公認。我正在尋找這個解決方案。它不在.NET 1.1 FW中,該代碼使用,但它很快就會成爲.NET 4。 – 2012-01-09 15:35:23

4

有一個StartsWith overload支持區分大小寫的匹配:

if (keyAttributeValue.StartsWith(STR_ConnectionString, 
           StringComparison.InvariantCultureIgnoreCase) 
{ 
    ... 
} 

這也使得你的代碼更易讀,因爲它表達你的意圖:你真正想要的是一個不區分大小寫的比較,這就是這裏寫的。您並不是真的想要「將大小寫轉換爲大寫的區分大小寫的比較」......這只是您用來實現目標的解決方法。

1

我做了一個擴展方法,它使用StringComparison忽略大小寫來處理這個在我的項目中。

public static string StartsWithIgnoreCase(this string value, string startsWith) 
{ 
    return value.StartsWith(value, StringComparison.InvariantCultureIgnoreCase); 
} 

如果您願意,您可以添加空檢查。

+0

+1擴展方法是要走的路! – SQLMason 2012-01-09 14:27:12

+0

-1您的擴展方法只是隱藏您正在使用哪種類型的IgnoreCase。檢查http://stackoverflow.com/a/417992/146513和http://blogs.msdn.com/b/noahc/archive/2007/06/29/string-equals-performance-comparison.aspx以瞭解其差異並在每個特定情況下考慮這一點。 – 2013-10-17 14:59:43

+0

@Protron我使用了'InvariantCulture',因爲OP使用了'ToUpperInvariant'。你應該總是使用正確的文化。感謝您的好鏈接。 – cadrell0 2013-10-17 15:04:27

2

如果因爲你正在做的ToUpper的味道不好,則字符串比較,那些可以用startswith的重載組合:

STR_ConnectionString..StartsWith(upperCaseConnectionString, StringComparison.CurrentCultureIgnoreCase); 

但是,它看起來像你滾你自己的方式來處理應用程序配置,你不應該這樣做。見http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.aspx

+0

這是一種應用程序配置,但不完全是這樣的,我從一些本應該在幾年前開始踢球的球隊繼承了:)你不想知道其餘的繼承代碼是怎麼樣的。那麼也許你做了,但不是一次。請放心,我將在接下來的幾個月裏一步一步做重大的重構工作。 – 2012-01-09 15:30:53

2

總是有

keyAttributeValue.StartsWith(STR_ConnectionString, StringComparison.InvariantCultureIgnoreCase) 

但不會執行,以及你有什麼。如果你需要每秒做數千次,堅持你所擁有的。如果不是,只是做一個不區分大小寫的匹配。

還要考慮

keyAttributeValue.StartsWith(STR_ConnectionString, StringComparison.OrdinalIgnoreCase) 

這是更快,可能是你想要的要多。

相關問題