.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 = ; 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(); long ticks = DateTime.Now.Ticks;
for (int i = ; i < ; i++)
{
CompareStringInArrar(inputStr, arr);
}
Console.WriteLine("自定义数组查找(Ticks): {0}", DateTime.Now.Ticks - ticks);
////////////////////////////////////////
System.Threading.Thread.Sleep(); ticks = DateTime.Now.Ticks;
for (int i = ; i < ; i++)
{
FindStringInArrar0(ref findStr, arr);
}
Console.WriteLine("直接对象地址相等进行数组查找(Ticks):{0}", DateTime.Now.Ticks - ticks);
///////////////////////////////////
System.Threading.Thread.Sleep(); ticks = DateTime.Now.Ticks;
for (int i = ; i < ; i++)
{
FindStringInArrar(ref inputStr, arr);
}
Console.WriteLine("直接遍历进行数组查找(Ticks): {0}", DateTime.Now.Ticks - ticks); ///////////////////////////////////
System.Threading.Thread.Sleep(); ticks = DateTime.Now.Ticks;
for (int i = ; i < ; 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 = ; 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 = ; 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 = ; i < arr.Length; i++)
{
//strTemp = arr[i];
if (length == arr[i].Length)
{
flag = true;
for (int j = ; 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 = ; 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 = ; 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 = ;
long ticks2 = ;
long ticks3 = ;
long ticks4 = ;
long ticks5 = ; Stopwatch sw = Stopwatch.StartNew();
//预热
for (int i = ; i < ; i++)
{
bool b1 = string.Compare(A, B, StringComparison.OrdinalIgnoreCase) == ;
}
//开始
sw.Reset();
sw.Start();
for (int i = ; i < ; i++)
{
bool b1 = string.Compare(A, D, StringComparison.OrdinalIgnoreCase) == ;
}
ticks = sw.ElapsedTicks; sw.Reset();
sw.Start();
for (int i = ; i < ; i++)
{
bool b2 = string.Equals(A, C, StringComparison.OrdinalIgnoreCase);
}
ticks2 = sw.ElapsedTicks; sw.Reset();
sw.Start();
for (int i = ; i < ; i++)
{
bool b2 = string.Equals(A, D, StringComparison.OrdinalIgnoreCase);
}
ticks3 = sw.ElapsedTicks; sw.Reset();
sw.Start();
for (int i = ; i < ; i++)
{
bool b2 = string.Equals(A, E, StringComparison.OrdinalIgnoreCase);
}
ticks4 = sw.ElapsedTicks; sw.Reset();
sw.Start();
for (int i = ; i < ; 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();
}
}
最后得出结论,最后一种方式最快,原因在于首先判断了长度,如果不是一样的长度直接跳过比较,下面是测试数据:
input string(123Abc):
123Abc
,
,
,
,
.net字符串数组查找方式效率比较的更多相关文章
- Matlab 之 字符串数组查找
Matlab的优势在于向量操作,字符串操作往往费时费力,但是如果能充分利用Matlab自带的一些函数,也可以取得不错的效果.下面就介绍一下字符串数组查找的小技巧. 字符串数组我通常会选择应用cell格 ...
- JS 中的数组遍历方式效率比较
JS数组遍历,基本就是for,forin,foreach,forof,map等等一些方法,以下介绍几种本文分析用到的数组遍历方式以及进行性能分析对比 第一种:普通for循环 代码如下: ; j < ...
- 讨论下茴香逗的茴字有几种写法,javascript字符串数组查找“indexOf"的替代方式。
- 一个在字符串中查找多个关键字的函数strstrs(三种不同算法实现及效率分析)
平时项目中有时需要用到在字符串中搜索两个或更多的关键字的情景.例如:将字符串"ab|cd#ef|"按竖线或者井号做分隔 如果是大项目,一般会采用正则表达式做处理.但有时写个小程序, ...
- c语言中字符串数组初始化的一点总结&& c++访问控制的三种方式
char *c[]={"ONE","TWO","THREE","FOUR"}; // c语言中定义了一个字符串数组(也称 ...
- 014 Longest Common Prefix 查找字符串数组中最长的公共前缀字符串
编写一个函数来查找字符串数组中最长的公共前缀字符串. 详见:https://leetcode.com/problems/longest-common-prefix/description/ 实现语言: ...
- Lua大量字符串拼接方式效率对比及原因分析
Lua大量字符串拼接方式效率对比及原因分析_AaronChan的博客-CSDN博客_lua字符串拼接消耗 https://blog.csdn.net/qq_26958473/article/detai ...
- 查找常用字符(给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。)
给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表. 例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 ...
- [算法2-数组与字符串的查找与匹配] (.NET源码学习)
[算法2-数组与字符串的查找与匹配] (.NET源码学习) 关键词:1. 数组查找(算法) 2. 字符串查找(算法) 3. C#中的String(源码) 4. 特性Attribute 与内 ...
随机推荐
- Mongodb安装与配置详解
简介: mongodb作为一款通用型数据库,除了能够创建,读取,更新和删除数据外,还提供一系列不断扩展的独特功能. a.索引: mongodb支持二级索引,允许多种快速查询,且提供和唯一索引,复合索引 ...
- PC端和移动端地址适配
判断当前页面的打开方式是pc还是移动设备,如果是移动设备,跳转到对应移到端网站的方法: 方法一.还是用@media screen 思路:css使用媒体查询,当屏幕小于760px时,使某个元素的样式发生 ...
- CSS默认可继承样式
前面的话 一直想总结出一份可继承样式的列表.常听说,颜色和字体是可继承的,盒模型样式是不可继承的,但其他样式呢?本文内容包括所有可继承的样式 [注意]关于样式的详细信息移步至此 常用可继承样式 col ...
- java中异常注意问题(发生在多态是的异常问题)
/* 异常的注意事项: 1,子类在覆盖父类方法时,父类的方法如果抛出了异常,那么子类的方法只能抛出父类的异常或者该异常的子类. 2,如果父类抛出多个异常,那么子类只能抛出父类异常的子集. 简单说:子类 ...
- js断点调试心得
虽然网上已经有多的数不清的调试教程了,但仍然没有发现哪篇文章写的通俗易懂,索性自己尝试写写自己的一些使用习惯或者说是心得,希望对那些还不是很懂得使用断点调试的孩子有一些帮助(大神请无视~). 1.断点 ...
- Deep learning:四十(龙星计划2013深度学习课程小总结)
头脑一热,坐几十个小时的硬座北上去天津大学去听了门4天的深度学习课程,课程预先的计划内容见:http://cs.tju.edu.cn/web/courseIntro.html.上课老师为微软研究院的大 ...
- Metronic – 超赞!基于 Bootstrap 的响应式后台管理模板
Metronic 是一套精美的响应式后台管理模板,基于强大的 Twitter Bootstrap 框架实现.Metronic 拥有简洁优雅的 Metro UI 风格界面,6 种颜色可选,76 个模板页 ...
- iOS-地图报错超出了经纬度范围Invalid Region
做地图定位的时候,使用一下代码 // 经纬度 CLLocationDegrees latitude = [storeDict[@"lat"] doubleValue]; CLLoc ...
- JS魔法堂:函数重载 之 获取变量的数据类型
Brief 有时我们需要根据入参的数据类型来决定调用哪个函数实现,就是说所谓的函数重载(function overloading).因为JS没有内置函数重载的特性,正好给机会我们思考和实现一套这样的机 ...
- 【转载】ASP.NET MVC的过滤器
APS.NET MVC中(以下简称“MVC”)的每一个请求,都会分配给相应的控制器和对应的行为方法去处理,而在这些处理的前前后后如果想再加一些额外的逻辑处理.这时候就用到了过滤器. MVC支持的过滤器 ...