C 中字串的比較操作

2021-08-02 12:51:00 字數 4512 閱讀 6288

查詢api判斷字串相等或排序時,由以下方法:

public override bool equals(object obj);

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

發現上述的方法中大多都有stringcomparison型別的列舉,查詢msdn後得到:

現簡單寫一段**,測試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)

if (stra == null)

if (strb == null)

return compareordinalhelper(stra, strb);

}

接下來看看string.compareto()方法的源**:

[targetedpatchingoptout("performance critical to inline across ngen image boundaries")]

public int compareto(string strb)

return

cultureinfo.currentculture.compareinfo.compare(this, strb, compareoptions.none);

}

與型別引數為stringcomparison.currentculture的compare方法相同。

另外stringcomparer也實現了字串比較方法compare()方法。直接看源**:

public int compare(object x, object y)

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

}

如果程式只將字串用於內部編碼目的,如路徑名、檔名、url、環境變數、反射、xml標記等,這些字串通常只在程式內部使用,不會像使用者展示,應該使用string.ordinal或者使用string.compareordinal()方法

總結及建議:

使用顯示地指定了字串比較規則的過載函式。一般來說,需要帶有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 將當前字串物件與另乙...