.net字符串数组查找方式效率比较
下面是代码:
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