学习来源:https://blog.csdn.net/onelei1994/article/details/101054633
之前一直看有人说Unity中的字符串拼接会产生很大消耗,因此来学习一下字符串拼接的优化类,详细的可以参考上面这篇帖子,这里我们直接站在巨人的肩膀上摘取一下果实。
使用方法很简单:
using System.Text;
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
//用法1
Debug.Log(StringEx.Concat("Afff", "Bfff"));
Debug.Log(StringEx.Concat("C", ""));
//用法2
StringBuilder stringBuilder = StringEx.GetShareStringBuilder();
for (int i = 0; i < 100; i++)
{
stringBuilder.Append(i.ToString());
}
Debug.Log(stringBuilder.ToString());
}
}
输出结果可以看到是拼接成功了(第三个0是其他地方输出的,忽略即可):

至于这玩意对性能的影响到底有多大,咱也懒得测啊,直接用就完事了~
原博的静态类缺少长度为0判断,因此直接运行上述案例会出现报错,改后的静态类代码如下:
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
using UnityEngine;
/// <summary>
/// 字符串优化类
/// </summary>
public static class StringEx
{
private static StringBuilder stringBuilder = new StringBuilder();
private static StringBuilder shareStringBuilder = new StringBuilder();
/// <summary>
/// 获取共享StringBuilder
/// </summary>
/// <returns></returns>
public static StringBuilder GetShareStringBuilder()
{
if (shareStringBuilder.Length > 0)
shareStringBuilder.Remove(0, stringBuilder.Length);
return shareStringBuilder;
}
/// <summary>
/// 合并字符串
/// </summary>
/// <param name="src"></param>
/// <param name="args"></param>
/// <returns></returns>
public static string Format(string src, params object[] args)
{
if (stringBuilder.Length > 0)
stringBuilder.Remove(0, stringBuilder.Length);
stringBuilder.AppendFormat(src, args);
return stringBuilder.ToString();
}
/// <summary>
/// 合并字符串
/// </summary>
/// <param name="s1"></param>
/// <param name="s2"></param>
/// <returns></returns>
public static string Concat(string s1, string s2)
{
if (stringBuilder.Length > 0)
stringBuilder.Remove(0, stringBuilder.Length);
stringBuilder.Append(s1);
stringBuilder.Append(s2);
return stringBuilder.ToString();
}
/// <summary>
/// 合并字符串
/// </summary>
/// <param name="s1"></param>
/// <param name="s2"></param>
/// <param name="s3"></param>
/// <returns></returns>
public static string Concat(string s1, string s2, string s3)
{
if (stringBuilder.Length > 0)
stringBuilder.Remove(0, stringBuilder.Length);
stringBuilder.Append(s1);
stringBuilder.Append(s2);
stringBuilder.Append(s3);
return stringBuilder.ToString();
}
/// <summary>
/// 移除前缀字符串
/// </summary>
/// <param name="self"></param>
/// <param name="str"></param>
/// <returns></returns>
public static string RemovePrefixString(this string self, string str)
{
string strRegex = @"^(" + str + ")";
return Regex.Replace(self, strRegex, "");
}
/// <summary>
/// 移除后缀字符串
/// </summary>
/// <param name="self"></param>
/// <param name="str"></param>
/// <returns></returns>
public static string RemoveSuffixString(this string self, string str)
{
string strRegex = @"(" + str + ")" + "$";
return Regex.Replace(self, strRegex, "");
}
/// <summary>
/// 匹配正则表达式
/// </summary>
/// <param name="slef"></param>
/// <param name="pattern"></param>
/// <returns></returns>
public static bool RegexMatch(this string slef, string pattern)
{
Regex reg = new Regex(pattern);
return reg.Match(slef).Success;
}
/// <summary>
/// 是否为Email
/// </summary>
/// <param name="self"></param>
/// <returns></returns>
public static bool IsEmail(this string self)
{
return self.RegexMatch(@"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$");
}
/// <summary>
/// 是否为域名
/// </summary>
/// <param name="self"></param>
/// <returns></returns>
public static bool IsDomain(this string self)
{
return self.RegexMatch(@"[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?");
}
/// <summary>
/// 是否为域名
/// </summary>
/// <param name="self"></param>
/// <returns></returns>
public static bool IsIP(this string self)
{
return self.RegexMatch(@"((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))");
}
/// <summary>
/// 是否为手机号码
/// </summary>
/// <param name="self"></param>
/// <returns></returns>
public static bool IsMobilePhone(this string self)
{
return self.RegexMatch(@"^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$");
}
/// <summary>
/// 转换为MD5, 加密结果"x2"结果为32位,"x3"结果为48位,"x4"结果为64位
/// </summary>
/// <param name="self"></param>
/// <param name="flag"></param>
/// <returns></returns>
public static string ConvertToMD5(this string self, string flag = "x2")
{
byte[] sor = Encoding.UTF8.GetBytes(self);
MD5 md5 = MD5.Create();
byte[] result = md5.ComputeHash(sor);
StringBuilder strbul = new StringBuilder(40);
for (int i = 0; i < result.Length; i++)
{
strbul.Append(result[i].ToString(flag));
}
return strbul.ToString();
}
/// <summary>
/// 转换为32位MD5
/// </summary>
/// <param name="self"></param>
/// <returns></returns>
public static string ConvertToMD5_32(this string self)
{
return ConvertToMD5(self, "x2");
}
/// <summary>
/// 转换为48位MD5
/// </summary>
/// <param name="self"></param>
/// <returns></returns>
public static string ConvertToMD5_48(this string self)
{
return ConvertToMD5(self, "x3");
}
/// <summary>
/// 转换为64位MD5
/// </summary>
/// <param name="self"></param>
/// <returns></returns>
public static string ConvertToMD5_64(this string self)
{
return ConvertToMD5(self, "x4");
}
}
网友评论