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

简介:

下面是代码:

复制代码
 static void Main(string[] args)
        {
            string[] arr = new string[] { "AAA", "BBBB", "CCCC", "DDDD", "EEEEEE", "ffffff", "ggggggg", "hhhhhh", "iii", "", "jjj", "kkk" };
            string findStr = "kkk";
            for (int i = 0; i < arr.Length; i++)
            {
                if (object.ReferenceEquals(findStr, arr[i]))
                    Console.Write(" true1 ");
            }
            Console.WriteLine();
            Console.Write("input string kkk :");

            string inputStr = Console.ReadLine();

            if (CompareStringInArrar( inputStr, arr))
            {
                Console.WriteLine(" true2 ");
            }
            ///////////////////////
            Console.WriteLine("一千万次字符串数组元素查找:");
            System.Threading.Thread.Sleep(3000);

            long ticks = DateTime.Now.Ticks;
            for (int i = 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 (int i = 0; i < 10000000; i++)
            {
                FindStringInArrar0(ref findStr, arr);
            }
            Console.WriteLine("直接对象地址相等进行数组查找(Ticks):{0}", DateTime.Now.Ticks - ticks);
            ///////////////////////////////////
            System.Threading.Thread.Sleep(3000);

            ticks = DateTime.Now.Ticks;
            for (int i = 0; i < 10000000; i++)
            {
                FindStringInArrar(ref inputStr, arr);
            }
            Console.WriteLine("直接遍历进行数组查找(Ticks):        {0}", DateTime.Now.Ticks - ticks);

            ///////////////////////////////////
            System.Threading.Thread.Sleep(3000);

            ticks = DateTime.Now.Ticks;
            for (int i = 0; i < 10000000; i++)
            {
                CompareStringInArrar2( inputStr, arr);
            }
            Console.WriteLine("混合数组查找(Ticks):                {0}", DateTime.Now.Ticks - ticks);

           

           Console.Read();
            //DBMethod();
        }

        private static bool FindStringInArrar0(ref string inputStr, string[] arr)
        {
            for (int j = 0; j < arr.Length; j++)
            {
                if (object.ReferenceEquals(inputStr, arr[j]))
                    return true;
            }
            return false;
        }

        private static bool FindStringInArrar(ref string inputStr, string[] arr)
        {
            for (int j = 0; j < arr.Length; j++)
            {
                if (inputStr == arr[j])
                    return true;
            }
            return false;
        }

        private static bool CompareStringInArrar( string inputStr, string[] arr)
        {
            //char[] inputCharArr = inputStr.ToCharArray();
            int length = inputStr.Length;
            bool flag = true;
            //string strTemp = null;
            for (int i = 0; i < arr.Length; i++)
            {
                //strTemp = arr[i];
                if (length == arr[i].Length)
                {
                    flag = true;
                    for (int j = 0; j < length; j++)
                    {
                        if (inputStr[j] != arr[i][j])
                        {
                            flag = false;
                            break;
                        }
                    }
                    if (flag)
                        return true;
                }
            }
            return false;
        }

        /// <summary>
        /// 混合查找
        /// </summary>
        /// <param name="inputStr"></param>
        /// <param name="arr"></param>
        /// <returns></returns>
        private static bool CompareStringInArrar2(string inputStr, string[] arr)
        {
            //char[] inputCharArr = inputStr.ToCharArray();
            int length = inputStr.Length;
            bool flag = true;
            //string strTemp = null;
            for (int i = 0; i < arr.Length; i++)
            {
                if (object.ReferenceEquals(inputStr, arr[i]))
                    return true;
                //strTemp = arr[i];
                if (length == arr[i].Length)
                {
                    flag = true;
                    for (int j = 0; j < length; j++)
                    {
                        if (inputStr[j] != arr[i][j])
                        {
                            flag = false;
                            break;
                        }
                    }
                    if (flag)
                        return true;
                }
            }
            return false;
        }
复制代码

 

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

复制代码
class Program
    {
        static void Main(string[] args)
        {
            string A = "124Abc";
            string B = "2345b";
            string C = "124abce";
            Console.WriteLine("input string(123Abc):");
            string D = Console.ReadLine();
            string E = "124Abc";

            long ticks = 0;
            long ticks2 = 0;
            long ticks3 = 0;
            long ticks4 = 0;
            long ticks5 = 0;
            

            Stopwatch sw = Stopwatch.StartNew();
            //预热
            for (int i = 0; i < 1000000; i++)
            {
                bool b1 = string.Compare(A, B, StringComparison.OrdinalIgnoreCase) == 0;
            }
            //开始
            sw.Reset();
            sw.Start();
            for (int i = 0; i < 1000000; i++)
            {
                bool b1 = string.Compare(A, D, StringComparison.OrdinalIgnoreCase) == 0;
            }
            ticks = sw.ElapsedTicks;

            sw.Reset();
            sw.Start();
            for (int i = 0; i < 1000000; i++)
            {
                bool b2 = string.Equals(A, C, StringComparison.OrdinalIgnoreCase);
            }
            ticks2 = sw.ElapsedTicks;

            sw.Reset();
            sw.Start();
            for (int i = 0; i < 1000000; i++)
            {
                bool b2 = string.Equals(A, D, StringComparison.OrdinalIgnoreCase);
            }
            ticks3 = sw.ElapsedTicks;

            sw.Reset();
            sw.Start();
            for (int i = 0; i < 1000000; i++)
            {
                bool b2 = string.Equals(A, E, StringComparison.OrdinalIgnoreCase);
            }
            ticks4 = sw.ElapsedTicks;

            sw.Reset();
            sw.Start();
            for (int i = 0; i < 1000000; i++)
            {
                bool b2 = 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();
        }
    }
复制代码

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

相关文章
|
8月前
|
开发框架 .NET
.net 字符串逗号隔开去重
.net 字符串逗号隔开去重
34 0
.net 字符串逗号隔开去重
|
12月前
|
API
.NET指定图片地址下载并转换Base64字符串
.NET指定图片地址下载并转换Base64字符串
114 0
|
JSON 数据格式
将JSON字符串反序列化为指定的.NET对象类型
将JSON字符串反序列化为指定的.NET对象类型
150 0
.NET中将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),并使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA
.NET中将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),并使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA
264 0
|
JSON 开发框架 算法
.Net 序列化枚举为字符串
我所做的项目是需要调用业务算法的,算法中有一个入参是油品的性质,这个性质有名称、编码、类型等属性,其中类型是固定质量性质、体积性质和其他性质这三种,所以我把其作为枚举类型。问题也由此产生,默认情况下,枚举是以其整数形式进行 JSON 序列化,这就需要同研发算法的同事约定好数值的含义。但是经过协商,算法同事要求我们传递成字符串。因此,我们希望它们在一些情况下以字符串的形式进行序列化。本文将讲解实现这一目标的各种方法。
.NET 字符串 编码转换 GB2312 UTF8
将 gb2312 转换 utf8 编码 private void button1_Click(object sender, System.EventArgs e) {  byte[] temp;  //将 textBox1.
1598 0
|
JSON 前端开发 数据格式
.net MVC 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错,字符串的长度超过了为 maxJsonLength 属性设置的值
在.net mvc的controller中,方法返回JsonResult,一般我们这么写: [HttpPost] public JsonResult QueryFeature(string url, string whereClause) { string str=""; return Json(str); }   此时如果str过长,就会报“使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错,字符串的长度超过了为 maxJsonLength 属性设置的值”。
2872 0
|
C#
.NET6新东西--插值字符串优化
.NET6新东西--插值字符串优化
197 0
|
测试技术
.net持续集成测试篇之Nunit文件断言、字符串断言及集合断言
.net持续集成测试篇之Nunit文件断言、字符串断言及集合断言使用前面讲过的方法基本上能够完成工作中的大部分任务了,然而有些功能实现起来还是比较麻烦的,比如说字符串相等性比较不区分大小写,字符串是否匹配某一正则规则,集合中的每一个(某一个)元素是否符合特定规则等,Nunit提供了一些特定的方法用来实现一些用普通断言比较难以实现的扩展类型和方法.
790 0
|
SQL JSON .NET
一起谈.NET技术,ASP.NET用SQL Server中的数据来生成JSON字符串
  最近在学习ExtJs与ASP.NET结合开发,前者用到的数据内容基本上都是JSON格式,遂想写一个格式化数据成JSON的东东,在网上找了一下,发现还蛮多的,实现了一个类似于ToString()的方法,名曰:ToJson()。
1134 0