string-Contains&indexOf
[Pure] public bool Contains( string value ) { return ( IndexOf(value, StringComparison.Ordinal) >=0 ); }
[Pure] [System.Security.SecuritySafeCritical] public int IndexOf(String value, int startIndex, int count, StringComparison comparisonType) { // Validate inputs if (value == null) throw new ArgumentNullException("value"); if (startIndex < 0 || startIndex > this.Length) throw new ArgumentOutOfRangeException("startIndex", Environment.GetResourceString("ArgumentOutOfRange_Index")); if (count < 0 || startIndex > this.Length - count) throw new ArgumentOutOfRangeException("count", Environment.GetResourceString("ArgumentOutOfRange_Count")); Contract.EndContractBlock(); switch (comparisonType) { case StringComparison.CurrentCulture: return CultureInfo.CurrentCulture.CompareInfo.IndexOf(this, value, startIndex, count, CompareOptions.None); case StringComparison.CurrentCultureIgnoreCase: return CultureInfo.CurrentCulture.CompareInfo.IndexOf(this, value, startIndex, count, CompareOptions.IgnoreCase); case StringComparison.InvariantCulture: return CultureInfo.InvariantCulture.CompareInfo.IndexOf(this, value, startIndex, count, CompareOptions.None); case StringComparison.InvariantCultureIgnoreCase: return CultureInfo.InvariantCulture.CompareInfo.IndexOf(this, value, startIndex, count, CompareOptions.IgnoreCase); case StringComparison.Ordinal: return CultureInfo.InvariantCulture.CompareInfo.IndexOf(this, value, startIndex, count, CompareOptions.Ordinal); case StringComparison.OrdinalIgnoreCase: if (value.IsAscii() && this.IsAscii()) return CultureInfo.InvariantCulture.CompareInfo.IndexOf(this, value, startIndex, count, CompareOptions.IgnoreCase); else return TextInfo.IndexOfStringOrdinalIgnoreCase(this, value, startIndex, count); default: throw new ArgumentException(Environment.GetResourceString("NotSupported_StringComparison"), "comparisonType"); } }
但contains于indexof还是有一些性能区别的。
contains:StringComparison.Ordinal
indexof:不指定StringComparison使用的是:StringComparison.CurrentCulture
StringComparison.Ordinal和StringComparison.CurrentCulture在效率上会有这么大的差别呢?那下面我们得研究一下这两种比较类型的特点了。
我从MSDN上http://msdn.microsoft.com/en-us/library/dd465121.aspx 找到了这么一句话:
Use comparisons with StringComparison.Ordinal or StringComparison.OrdinalIgnoreCase for better performance.
从上面地址中我们还可以获取一些其他信息,在String Comparisons that Use the Current Culture一栏中提到对于使用CurrentCulture参数,每次都需要检查当前环境信息,个人怀疑可能是这一点耗费了效率
CurrentCulture 使用区域敏感排序规则和当前区域比较字符串。
CurrentCultureIgnoreCase 使用区域敏感排序规则、当前区域来比较字符串,同时忽略被比较字符串的大小写。
InvariantCulture 使用区域敏感排序规则和固定区域比较字符串。
InvariantCultureIgnoreCase 使用区域敏感排序规则、固定区域来比较字符串,同时忽略被比较字符串的大小写。
Ordinal 使用序号排序规则比较字符串。
OrdinalIgnoreCase 使用序号排序规则并忽略被比较字符串的大小写,对字符串进行比较。
Thread.CurrentThread.CurrentCulture= new CultureInfo("en-US"); //当前的区域信息是美国 string s1 = "visualstudio"; string s2 = "windows"; //Console.WriteLine(String.Compare(s1,s2, StringComparison.CurrentCulture)); //输出"-1" Debug.Log(String.Compare(s1, s2, StringComparison.CurrentCulture)); Thread.CurrentThread.CurrentCulture= new CultureInfo("sv-SE"); //当前的区域信息是瑞典 //Console.WriteLine(String.Compare(s1,s2, StringComparison.CurrentCulture)); //输出"1" Debug.Log(String.Compare(s1, s2, StringComparison.CurrentCulture));