c#测试字符串是否为GUID的几种方法
以前为了赶项目遇到这种需求时,也没过多考虑性能因素,随便写了一个(现在看起来很原始的)方法来实现:
static bool IsGuidByError(string strSrc){if (String.IsNullOrEmpty(strSrc)) { return false; }bool _result = false;try{Guid _t = new Guid(strSrc);_result = true;}catch { }return _result;}
但是大家都知道,异常捕获是要有性能损耗的。今天想了想:其实还有其它方法,也许会更好
static bool IsGuidByReg(string strSrc){Regex reg = new Regex("^[A-F0-9]{8}(-[A-F0-9]{4}){3}-[A-F0-9]{12}$", RegexOptions.Compiled);return reg.IsMatch(strSrc);}
此外,根据Guid的格式规则:总长数36位,由4个'-'分隔,每一段都是由数字+英文字母组合而成。也可以自己写一个算法:
static bool IsGuidByArr(string strSrc){if (String.IsNullOrEmpty(strSrc) || strSrc.Length!=36) { return false; }string[] arr = strSrc.Split('-');if (arr.Length != 5) { return false; }for (int i = 0; i < arr.Length; i++){for (int j = 0; j < arr[i].Length; j++){char a = arr[i][j];if (!((a >= 48 && a <= 57) || (a >= 65 && a <= 90) || (a >= 97 && a <= 122))){return false;}}}return true;}
另:经猎风同学提醒,应该还要考虑到正则表达式不编译的情况,所以再加上这一段
static bool IsGuidByRegNoComplied(string strSrc){Regex reg = new Regex("^[A-F0-9]{8}(-[A-F0-9]{4}){3}-[A-F0-9]{12}$");return reg.IsMatch(strSrc);}
此外:尘尘同学在回复中提醒到还有Guid的TryParse/Parse方法(不过该方法是.Net 4.0才新增加的)
static bool IsGuidByParse(string strSrc) {Guid g = Guid.Empty;return Guid.TryParse(strSrc, out g);}
对于猎风与尘尘的反馈表示感谢!ok,搞了这么多方法,是骡子是马,溜溜便知:
先测试字符串格式正常的情况
using System;
using System.Diagnostics;
using System.Text.RegularExpressions;namespace ConsoleApplication1
{class Program{static void Main(string[] args){string a = "C0869370-70BF-4408-A8CF-72A77BB1D788"; Console.WriteLine(IsGuidByError(a));Console.WriteLine(IsGuidByReg(a));Console.WriteLine(IsGuidByRegNoComplied(a));Console.WriteLine(IsGuidByArr(a));Console.WriteLine(IsGuidByParse(a));Console.WriteLine("测试开始------------------->\n");Stopwatch sw = new Stopwatch();int count = 5000;int times = 5;long result = 0;for (int i = 0; i < times; i++){result += Test(sw, count, a, MethodType.异常);}Console.WriteLine("\n{0}次×{1}轮测试,[异常]方法平均每轮速度:{2}\n", count, times, result / times);Console.Write("\n");result = 0;for (int i = 0; i < times; i++){result += Test(sw, count, a, MethodType.正则);}Console.WriteLine("\n{0}次×{1}轮测试,[正则]方法平均每轮速度:{2}\n", count, times, result / times);Console.Write("\n");result = 0;for (int i = 0; i < times; i++){result += Test(sw, count, a, MethodType.正则不编译);}Console.WriteLine("\n{0}次×{1}轮测试,[正则不编译]方法平均每轮速度:{2}\n", count, times, result / times);Console.Write("\n");result = 0;for (int i = 0; i < times; i++){result += Test(sw, count, a, MethodType.数组);}Console.WriteLine("\n{0}次×{1}轮测试,[数组]方法平均每轮速度:{2}\n", count, times, result / times);result = 0;for (int i = 0; i < times; i++){result += Test(sw, count, a, MethodType.TryParse);}Console.WriteLine("\n{0}次×{1}轮测试,[TryParse]方法平均每轮速度:{2}\n", count, times, result / times);Console.Read();}static bool IsGuidByArr(string strSrc){if (String.IsNullOrEmpty(strSrc) || strSrc.Length!=36) { return false; }string[] arr = strSrc.Split('-');if (arr.Length != 5) { return false; }for (int i = 0; i < arr.Length; i++){for (int j = 0; j < arr[i].Length; j++){char a = arr[i][j];if (!((a >= 48 && a <= 57) || (a >= 65 && a <= 90) || (a >= 97 && a <= 122))){return false;}}}return true;}static bool IsGuidByError(string strSrc){if (String.IsNullOrEmpty(strSrc)) { return false; }bool _result = false;try{Guid _t = new Guid(strSrc);_result = true;}catch { }return _result;}static bool IsGuidByReg(string strSrc){Regex reg = new Regex("^[A-F0-9]{8}(-[A-F0-9]{4}){3}-[A-F0-9]{12}$", RegexOptions.Compiled);return reg.IsMatch(strSrc);}static bool IsGuidByRegNoComplied(string strSrc){Regex reg = new Regex("^[A-F0-9]{8}(-[A-F0-9]{4}){3}-[A-F0-9]{12}$");return reg.IsMatch(strSrc);}static bool IsGuidByParse(string strSrc) {Guid g = Guid.Empty;return Guid.TryParse(strSrc, out g);}/// <summary>/// 测试/// </summary>/// <param name="sw"></param>/// <param name="count"></param>/// <param name="a"></param>/// <param name="useRegularExpressions"></param>/// <returns></returns>static long Test(Stopwatch sw, int count, string a, MethodType type){bool _test = false;int i = 0;sw.Reset();sw.Start();for (i = 0; i < count; i++){switch (type){case MethodType.异常:_test = IsGuidByError(a);break;case MethodType.数组:_test = IsGuidByArr(a);break;case MethodType.正则:_test = IsGuidByReg(a);break;case MethodType.正则不编译:_test = IsGuidByReg(a);break;case MethodType.TryParse:_test = IsGuidByParse(a);break;default:break;}}sw.Stop();Console.Write(sw.ElapsedMilliseconds + "\n");return sw.ElapsedMilliseconds;}enum MethodType{异常,数组,正则,正则不编译,TryParse}}
}
True
True
True
True
True
测试开始------------------->
5
5
5
5
5
5000次×5轮测试,[异常]方法平均每轮速度:5
9219
9235
9360
9272
9103
5000次×5轮测试,[正则]方法平均每轮速度:9237
9095
9113
9116
9181
9156
5000次×5轮测试,[正则不编译]方法平均每轮速度:9132
9
5
7
5
6
5000次×5轮测试,[数组]方法平均每轮速度:6
4
4
4
4
4
5000次×5轮测试,[TryParse]方法平均每轮速度:4
可以看到,在字符串格式正确的情况下,异常未被触发,除正则表达式显得巨慢以外,其它三种方法相差无已。
再来看下字符串格式错误的情况下
把string a = "C0869370-70BF-4408-A8CF-72A77BB1D788";改成string a = "C0869370-70BF-4408-A8CF-72A77BB1D788111111111111";
输出结果如下:
False
False
False
False
False
测试开始------------------->
35575
33681
33752
33985
33804
5000次×5轮测试,[异常]方法平均每轮速度:34159
8982
9104
9087
8959
8973
5000次×5轮测试,[正则]方法平均每轮速度:9021
9041
9102
9056
8977
8872
5000次×5轮测试,[正则不编译]方法平均每轮速度:9009
0
0
0
0
0
5000次×5轮测试,[数组]方法平均每轮速度:0
1
1
1
1
1
5000次×5轮测试,[TryParse]方法平均每轮速度:1
很明显,这时候异常带来的性能开销就很可观了,反而基于“字符数组”的检测方法最快(这跟测试用例有关,因为该字符串长度大于36,直接就出局了,连后面的循环都不用,如果换成其它错误的格式比如:“C0869370-70BF-4408-A8CF-72A77BB1D78?”,可能略有差异)
结论:综合考虑,推荐大家用“基于字符数组”的检测方法或Guid内置的TryParse方法,异常捕获和正则表达式方法应该避免使用。
c#测试字符串是否为GUID的几种方法相关推荐
- java equals 判断空_Java 判断字符串是否为空的三种方法与性能分析
[java中判断字符串是否为数字的三种方法 1>用JAVA自带的函数 public static boolean isNumeric(String str){ for (int i = s ...
- Shell中判断字符串是否为数字的6种方法
Shell中判断字符串是否为数字的6种方法 #!/bin/bash # 方法1 a=1234;echo "$a"|[ -n "`sed -n '/^[0-9][0-9]* ...
- Java 判断字符串是否为空的四种方法、优缺点与注意事项
以下是Java 判断字符串是否为空的四种方法: 方法一: 最多人使用的一个方法, 直观, 方便, 但效率很低: if(s == null ||"".equals(s)); 方法二: ...
- java字符串为空抛出异常_Java 判断字符串是否为空的四种方法,及效率比较。
以下是Java 判断字符串是否为空的四种方法: 方法一: 最多人使用的一个方法, 直观, 方便, 但效率很低: if(s == null ||"".equals(s)); 方法二: ...
- javascript中将字符串转换为json格式的三种方法
摘自:http://www.phpzixue.cn/detail1128.shtml javascript中将字符串转换为json格式的三种方法: json在我们js的开发过程中经常会用到像在使用a ...
- python判断字符串出现的次数_【如何判断python字符串出现次数?这几种方法你一定要学会】- 环球网校...
[摘要]python应用阶段是实际的工作经验,现在如何判断python字符串出现次数?这几种方法你一定要学会,小编建议大家可以试着理解这些内容,也许对您的python学习有帮助,毕竟实践出真知,所以你 ...
- php 去掉后导字符,PHP去除字符串最后一个字符的三种方法实例
前言 本文讲讲PHP中如何正确的去除字符串中的最后一个字符,之前跟大家分享过一篇关于PHP去除字符串最后一个字符的三种方法的文章,但是没给出实例,下面话不多说,直接上代码,相信一眼就能看出来了,直接将 ...
- java json转抽象对象_做一次面向对象的体操:将 JSON 字符串转换为嵌套对象的一种方法...
原标题:做一次面向对象的体操:将 JSON 字符串转换为嵌套对象的一种方法 来源:琴水玉 , www.cnblogs.com/lovesqcc/p/9478678.html 程序员共读整理发布,转载请 ...
- python中字符串转成数字的几种方法
在python列表操作中,面对需要把列表中的字符串转为礼拜的操作,无需强转,通过简单的几步就可以实现,本文介绍python中字符串转成数字的三种方法:1.使用join的方法:2.使用int函数将16进 ...
最新文章
- TP5.0 PHPExcel 数据表格导出导入(引)
- 初级搭建博客mysql_mysql 初级命令学习2
- 行为类模式(八):状态(State)
- 检索数据_1_从表中查询所有行和列
- 数据库的缓存管理[ASPNET2.0深入挖掘系列听后感]
- 乐在其中设计模式(C#)系列文章索引
- Java学习小程序(2)输出三个数中的最大值
- mysql 唯一索引 二叉法_mysql 唯一索引
- 华兴数控g71外圆循环编程_数控车床加工时的复合循环指令G70,G71,G72,G73
- 有钱就是任性!阿里20亿美元拿下网易考拉:欢迎加入阿里动物园
- 2017年网易游戏数据挖掘/机器学习实习生笔试
- python删除指定字符_python删除字符串中指定字符的方法
- NPOI 多个Excel合并为一个Excel
- 【历史上的今天】2 月 17 日:谷歌收购 Blogger;英伟达创始人出生;微软发布 Windows 2000
- gcc cross compiler 问题
- jmeter压力测试工具,雪崩效应,容错组件Sentinel
- pdf压缩文件怎么压缩最小,pdf大小超过上传大小不能上传怎么压缩?
- Android -- 在线播放歌曲 1 -- 搜索歌曲
- xxljob默认登录_三千字带你搞懂XXL-JOB任务调度平台
- c语言实现翻页,css3实现翻页卡片