以前为了赶项目遇到这种需求时,也没过多考虑性能因素,随便写了一个(现在看起来很原始的)方法来实现:

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的几种方法相关推荐

  1. java equals 判断空_Java 判断字符串是否为空的三种方法与性能分析

    [java中判断字符串是否为数字的三种方法  1>用JAVA自带的函数 public static boolean isNumeric(String str){   for (int i = s ...

  2. Shell中判断字符串是否为数字的6种方法

    Shell中判断字符串是否为数字的6种方法 #!/bin/bash # 方法1 a=1234;echo "$a"|[ -n "`sed -n '/^[0-9][0-9]* ...

  3. Java 判断字符串是否为空的四种方法、优缺点与注意事项

    以下是Java 判断字符串是否为空的四种方法: 方法一: 最多人使用的一个方法, 直观, 方便, 但效率很低: if(s == null ||"".equals(s)); 方法二: ...

  4. java字符串为空抛出异常_Java 判断字符串是否为空的四种方法,及效率比较。

    以下是Java 判断字符串是否为空的四种方法: 方法一: 最多人使用的一个方法, 直观, 方便, 但效率很低: if(s == null ||"".equals(s)); 方法二: ...

  5. javascript中将字符串转换为json格式的三种方法

    摘自:http://www.phpzixue.cn/detail1128.shtml javascript中将字符串转换为json格式的三种方法:  json在我们js的开发过程中经常会用到像在使用a ...

  6. python判断字符串出现的次数_【如何判断python字符串出现次数?这几种方法你一定要学会】- 环球网校...

    [摘要]python应用阶段是实际的工作经验,现在如何判断python字符串出现次数?这几种方法你一定要学会,小编建议大家可以试着理解这些内容,也许对您的python学习有帮助,毕竟实践出真知,所以你 ...

  7. php 去掉后导字符,PHP去除字符串最后一个字符的三种方法实例

    前言 本文讲讲PHP中如何正确的去除字符串中的最后一个字符,之前跟大家分享过一篇关于PHP去除字符串最后一个字符的三种方法的文章,但是没给出实例,下面话不多说,直接上代码,相信一眼就能看出来了,直接将 ...

  8. java json转抽象对象_做一次面向对象的体操:将 JSON 字符串转换为嵌套对象的一种方法...

    原标题:做一次面向对象的体操:将 JSON 字符串转换为嵌套对象的一种方法 来源:琴水玉 , www.cnblogs.com/lovesqcc/p/9478678.html 程序员共读整理发布,转载请 ...

  9. python中字符串转成数字的几种方法

    在python列表操作中,面对需要把列表中的字符串转为礼拜的操作,无需强转,通过简单的几步就可以实现,本文介绍python中字符串转成数字的三种方法:1.使用join的方法:2.使用int函数将16进 ...

最新文章

  1. TP5.0 PHPExcel 数据表格导出导入(引)
  2. 初级搭建博客mysql_mysql 初级命令学习2
  3. 行为类模式(八):状态(State)
  4. 检索数据_1_从表中查询所有行和列
  5. 数据库的缓存管理[ASPNET2.0深入挖掘系列听后感]
  6. 乐在其中设计模式(C#)系列文章索引
  7. Java学习小程序(2)输出三个数中的最大值
  8. mysql 唯一索引 二叉法_mysql 唯一索引
  9. 华兴数控g71外圆循环编程_数控车床加工时的复合循环指令G70,G71,G72,G73
  10. 有钱就是任性!阿里20亿美元拿下网易考拉:欢迎加入阿里动物园
  11. 2017年网易游戏数据挖掘/机器学习实习生笔试
  12. python删除指定字符_python删除字符串中指定字符的方法
  13. NPOI 多个Excel合并为一个Excel
  14. 【历史上的今天】2 月 17 日:谷歌收购 Blogger;英伟达创始人出生;微软发布 Windows 2000
  15. gcc cross compiler 问题
  16. jmeter压力测试工具,雪崩效应,容错组件Sentinel
  17. pdf压缩文件怎么压缩最小,pdf大小超过上传大小不能上传怎么压缩?
  18. Android -- 在线播放歌曲 1 -- 搜索歌曲
  19. xxljob默认登录_三千字带你搞懂XXL-JOB任务调度平台
  20. c语言实现翻页,css3实现翻页卡片

热门文章

  1. sysaux表空间数据库块损坏/游离块的修复
  2. RMAN的rman: can't open target错误
  3. WAV文件C++分析与显示
  4. 一种新的验证码(改进版)
  5. Java虚拟机常见面试题
  6. 谈谈JQuery的Deferred对象
  7. Linux查看MBR的内容
  8. 防止在iOS设备中的Safari将数字识别为电话号码
  9. NASM学习之Windows下编写16位程序
  10. 上拉电阻与下拉电阻的作用