查詢api判斷字串相等或排序時,由以下方法:
public override bool equals(object obj);發現上述的方法中大多都有stringcomparison型別的列舉,查詢msdn後得到:public bool equals(string value);
public static bool equals(string a, string b);
public bool equals(string value, stringcomparison comparisontype);
public static bool equals(string a, string b, stringcomparison comparisontype);
public static int compare(string stra, string strb);
public static int compare(string stra, string strb, bool ignorecase);
public static int compare(string stra, string strb, stringcomparison comparisontype);
public static int compare(string stra, string strb, bool ignorecase, cultureinfo culture);
public static int compare(string stra, string strb, cultureinfo culture, compareoptions options);
public static int compare(string stra, int indexa, string strb, int indexb, int length);
public static int compare(string stra, int indexa, string strb, int indexb, int length, bool ignorecase);
public static int compare(string stra, int indexa, string strb, int indexb, int length, stringcomparison comparisontype);
public static int compare(string stra, int indexa, string strb, int indexb, int length, bool ignorecase, cultureinfo culture);
public static int compare(string stra, int indexa, string strb, int indexb, int length, cultureinfo culture, compareoptions options);
public static int compareordinal(string stra, string strb);
public static int compareordinal(string stra, int indexa, string strb, int indexb, int length);
public int compareto(object value);
public int compareto(string strb);
現簡單寫一段**,測試compare(string stra, string strb, stringcomparison comparisontype)方法。分別用到stringcomparison.currentculture 和stringcomparison.ordinal。**如下:
static void執行結果如下:main(string args)
sw.stop();
console.writeline(sw.elapsedmilliseconds);
sw.reset();
for (int i = 0; i < 1000000; i++)
sw.stop();
console.writeline(sw.elapsedmilliseconds);
sw.reset();
for (int i = 0; i < 1000000; i++)
sw.stop();
console.writeline(sw.elapsedmilliseconds);
}
測試結果非常明顯,stringcomparison.currentculture顯式傳遞了當前語言文化,而傳遞了string.ordinal則會忽略指定的語言文化,這是執行字串最快的一種方式。
使用.net reflector檢視源**:
public static int compare(string stra, string strb, stringcomparison comparisontype)if (stra == strb)
if (stra == null)
if (strb == null)
switch (comparisontype)
return compareordinalignorecasehelper(stra, strb);
}throw new
notsupportedexception(environment.getresourcestring("notsupported_stringcomparison"));
}
在上例中,同時測試了string的compareordinal方法,效率同樣驚人。檢視其源**後發現與compare方法string.ordinal源**一樣,此方法只是compare方法的乙個特例:
public static int compareordinal(string stra, string strb)接下來看看string.compareto()方法的源**:if (stra == null)
if (strb == null)
return compareordinalhelper(stra, strb);
}
[targetedpatchingoptout("performance critical to inline across ngen image boundaries")]與型別引數為stringcomparison.currentculture的compare方法相同。public int compareto(string strb)
return
cultureinfo.currentculture.compareinfo.compare(this, strb, compareoptions.none);
}
另外stringcomparer也實現了字串比較方法compare()方法。直接看源**:
public int compare(object x, object y)如果程式只將字串用於內部編碼目的,如路徑名、檔名、url、環境變數、反射、xml標記等,這些字串通常只在程式內部使用,不會像使用者展示,應該使用string.ordinal或者使用string.compareordinal()方法if (x == null)
if (y == null)
string str = x as string;
if (str != null)
}icomparable comparable = x as
icomparable;
if (comparable == null)
return comparable.compareto(y);
}
總結及建議:
使用顯示地指定了字串比較規則的過載函式。一般來說,需要帶有stringcomparison型別引數的過載函式
在對未知文化的字串做比較時,使用stringcomparison.ordinal和stringcomparison.ordinallgnorecase作為預設值,提高效能
在像使用者輸出結果時,使用基於stringcomparison.currentculture的字串
使用string.equals的過載版本來測試兩個字串是否相等。
不要使用string.compare或compareto的過載版本來檢測返回值是否為0來判斷字串是否相等。這兩個函式是用於字串比較,而非檢查相等性。
在字串比較時,應以string.toupperinvariant函式使字串規範化,而不用tolowerinvariant方法,因為microsoft對執行大寫比較的**進行了優化。之所以不用toupper和tolower方法,是因為其對語言文化敏感。
C 字串比較及擷取子字串的操作
c 字串比較及擷取子字串的操作,1 從字串中提取子串 stringbuilder 類沒有支援子串的方法,因此必須用string類來提取。string mystring my name is ynn.displays name is ynn.console.writeline mystring.sub...
C 字串比較
1,str1.equals str2 2,int result string.compare str1,str2 int result string.compare str1,str2 true 忽略大小寫比較 3 在某些語言中,可以利用 來直接比較字串,而在 c 中,只能用 來比較兩個字串是否相等...
C 比較字串
net framework 提供多個方法來比較字串的值。下表列出並描述了這些值比較方法。方法名使用string.compare 比較兩個字串的值。返回整數值。string.compareordinal 比較兩個字串而不考慮本地區域性。返回整數值。string.compareto 將當前字串物件與另乙...