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

 


 

posted @ 2021-11-19 14:28  vba是最好的语言  阅读(199)  评论(0编辑  收藏  举报