.net字符串数组查找方式效率比较

王朝学院·作者佚名  2016-08-27  
宽屏版  字体: |||超大  

下面是代码:

staticvoidMain(string[] args)

{string[] arr =newstring[] {"AAA","BBBB","CCCC","DDDD","EEEEEE","ffffff","ggggggg","hhhhhh","iii","","jjj","kkk"};stringfindStr ="kkk";for(inti =0; i < arr.Length; i++)

{if(object.ReferenceEquals(findStr, arr[i]))

Console.Write("true1");

}

Console.WriteLine();

Console.Write("input string kkk :");stringinputStr =Console.ReadLine();if(CompareStringInArrar( inputStr, arr))

{

Console.WriteLine("true2");

}///////////////////////Console.WriteLine("一千万次字符串数组元素查找:");

System.Threading.Thread.Sleep(3000);longticks =DateTime.Now.Ticks;for(inti =0; i <10000000; i++)

{

CompareStringInArrar(inputStr, arr);

}

Console.WriteLine("自定义数组查找(Ticks): {0}", DateTime.Now.Ticks -ticks);////////////////////////////////////////System.Threading.Thread.Sleep(3000);

ticks=DateTime.Now.Ticks;for(inti =0; i <10000000; i++)

{

FindStringInArrar0(reffindStr, arr);

}

Console.WriteLine("直接对象地址相等进行数组查找(Ticks):{0}", DateTime.Now.Ticks -ticks);///////////////////////////////////System.Threading.Thread.Sleep(3000);

ticks=DateTime.Now.Ticks;for(inti =0; i <10000000; i++)

{

FindStringInArrar(refinputStr, arr);

}

Console.WriteLine("直接遍历进行数组查找(Ticks): {0}", DateTime.Now.Ticks -ticks);///////////////////////////////////System.Threading.Thread.Sleep(3000);

ticks=DateTime.Now.Ticks;for(inti =0; i <10000000; i++)

{

CompareStringInArrar2( inputStr, arr);

}

Console.WriteLine("混合数组查找(Ticks): {0}", DateTime.Now.Ticks -ticks);

Console.Read();//DBMethod();}PRivatestaticboolFindStringInArrar0(refstringinputStr,string[] arr)

{for(intj =0; j < arr.Length; j++)

{if(object.ReferenceEquals(inputStr, arr[j]))returntrue;

}returnfalse;

}privatestaticboolFindStringInArrar(refstringinputStr,string[] arr)

{for(intj =0; j < arr.Length; j++)

{if(inputStr ==arr[j])returntrue;

}returnfalse;

}privatestaticboolCompareStringInArrar(stringinputStr,string[] arr)

{//char[] inputCharArr = inputStr.ToCharArray();intlength =inputStr.Length;boolflag =true;//string strTemp = null;for(inti =0; i < arr.Length; i++)

{//strTemp = arr[i];if(length ==arr[i].Length)

{

flag=true;for(intj =0; j < length; j++)

{if(inputStr[j] !=arr[i][j])

{

flag=false;

break;

}

}if(flag)returntrue;

}

}returnfalse;

}///<summary>///混合查找///</summary>///<param name="inputStr"></param>///<param name="arr"></param>///<returns></returns>privatestaticboolCompareStringInArrar2(stringinputStr,string[] arr)

{//char[] inputCharArr = inputStr.ToCharArray();intlength =inputStr.Length;boolflag =true;//string strTemp = null;for(inti =0; i < arr.Length; i++)

{if(object.ReferenceEquals(inputStr, arr[i]))returntrue;//strTemp = arr[i];if(length ==arr[i].Length)

{

flag=true;for(intj =0; j < length; j++)

{if(inputStr[j] !=arr[i][j])

{

flag=false;

break;

}

}if(flag)returntrue;

}

}returnfalse;

}

但是通常比较都需要忽略大小写比较,所以不能单纯使用这种方式比较,用下面的测试代码:

classProgram

{staticvoidMain(string[] args)

{stringA ="124Abc";stringB ="2345b";stringC ="124abce";

Console.WriteLine("input string(123Abc):");stringD =Console.ReadLine();stringE ="124Abc";longticks =0;longticks2 =0;longticks3 =0;longticks4 =0;longticks5 =0;

Stopwatch sw=Stopwatch.StartNew();//预热for(inti =0; i <1000000; i++)

{boolb1 =string.Compare(A, B, StringComparison.OrdinalIgnoreCase) ==0;

}//开始sw.Reset();

sw.Start();for(inti =0; i <1000000; i++)

{boolb1 =string.Compare(A, D, StringComparison.OrdinalIgnoreCase) ==0;

}

ticks=sw.ElapsedTicks;

sw.Reset();

sw.Start();for(inti =0; i <1000000; i++)

{boolb2 =string.Equals(A, C, StringComparison.OrdinalIgnoreCase);

}

ticks2=sw.ElapsedTicks;

sw.Reset();

sw.Start();for(inti =0; i <1000000; i++)

{boolb2 =string.Equals(A, D, StringComparison.OrdinalIgnoreCase);

}

ticks3=sw.ElapsedTicks;

sw.Reset();

sw.Start();for(inti =0; i <1000000; i++)

{boolb2 =string.Equals(A, E, StringComparison.OrdinalIgnoreCase);

}

ticks4=sw.ElapsedTicks;

sw.Reset();

sw.Start();for(inti =0; i <1000000; i++)

{boolb2 = A.Length== C.Length &&string.Equals(A, C, StringComparison.OrdinalIgnoreCase);

}

ticks5=sw.ElapsedTicks;

Console.WriteLine("{0},\r\n{1},\r\n{2},\r\n{3},\r\n{4}\r\n", ticks, ticks2, ticks3, ticks4, ticks5);

Console.Read();

}

}

最后得出结论,最后一种方式最快,原因在于首先判断了长度,如果不是一样的长度直接跳过比较,下面是测试数据:

inputstring(123Abc):

123Abc87806,15255,58227,7569,1939

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有