.net字符串数组查找方式效率比较
时间:2022-04-28
本文章向大家介绍.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},rn{1},rn{2},rn{3},rn{4}rn", ticks, ticks2, ticks3, ticks4, ticks5);
Console.Read();
}
}
最后得出结论,最后一种方式最快,原因在于首先判断了长度,如果不是一样的长度直接跳过比较,下面是测试数据:
input string(123Abc):
123Abc
87806,
15255,
58227,
7569,
1939
- 【死磕Java并发】-----J.U.C之读写锁:ReentrantReadWriteLock
- 数据库中间件 MyCAT源码分析——跨库两表Join
- iOS一种动态栅格布局方案
- 消息队列中间件 RocketMQ 源码分析 —— Message 存储
- 数据库中间件 MyCAT 源码解析 —— 分片结果合并(一)
- 数据库分库分表中间件 Sharding-JDBC 源码分析 —— SQL 路由(一)之分库分表配置
- 数据库分库分表中间件 Sharding-JDBC 源码分析 —— SQL 解析(六)之删除SQL
- 数据库[分库分表]中间件 Sharding-JDBC 源码分析 —— SQL 解析(五)之更新SQL解析
- ExtJs+WCF+LINQ实现分页Grid
- 数据库[分库分表]中间件 Sharding-JDBC 源码分析 —— SQL 解析(四)之插入SQL
- 基于sliverlight + wcf的web 文字版IM 示例
- 数据库中间件 Sharding-JDBC 源码分析 —— SQL 解析(三)之查询SQL
- zephir-(11)流程控制语句
- phalcon-入门篇7(Model层基础使用)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- C++拾取——stl标准库中集合交集、并集、差集、对称差方法
- netty结合Protostuff传输对象案例,单机压测秒级接收35万个对象
- Kubernates之Deployment滚动升级和回滚
- 简记特定容器list和forward_list算法
- Games101--Assignment2
- 快速学习-如何使用sentinel
- springboot-mybatis-demo遇到的坑
- 快速学习-Sentinel 工作主流程
- 快速学习-Sentinel 流量控制
- 快速学习-Sentinel 熔断降级
- C#中关于SqlDataAdapter的Update(dataTable)方法
- Jmeter保存下载的文件
- SNAP Java API处理Sentinel-1数据
- springboot开发spark-submit的java代码
- Kustomize ConfigMapGenerate自动生成ConfigMap中的坑