using System.Globalization;
using System.Collections.Generic;
using System.Linq;
namespace MadRunFabric.Common
{
///
/// 字符串帮助类
///
public static class StringHelper
{
///
/// join 不会返回空
///
public static string Join(string spliter, IList list)
{
string str = string.Empty;
if (!ValidateHelper.IsPlumpList(list)) { return str; }
list.ToList().ForEach(delegate (string s)
{
s = ConvertHelper.GetString(s);
str += ((str == string.Empty) ? string.Empty : spliter) + s;
});
return str;
}
///
/// 可能返回空
///
///
///
///
public static List Split(string str, params char[] spliter)
{
return ConvertHelper.GetString(str).Split(spliter).ToList();
}
#region 截取字符串
///
/// 截取字符串
///
public static string SubString(string str, int startIndex, int length)
{
str = ConvertHelper.GetString(str);
if (str.Length > (startIndex + length))
{
return str.Substring(startIndex, length);
}
return str;
}
///
/// 截取字符串
///
public static string SubString(string str, int length)
{
return SubString(str, 0, length);
}
#endregion
#region 移除前导/后导字符串
///
/// 移除前导字符串
///
public static string TrimStart(string str, string trimStr, bool ignoreCase = true)
{
str = ConvertHelper.GetString(str);
trimStr = ConvertHelper.GetString(trimStr);
while (str.StartsWith(trimStr, ignoreCase, CultureInfo.CurrentCulture))
{
str = str.Remove(0, trimStr.Length);
}
return str;
}
///
/// 移除后导字符串
///
public static string TrimEnd(string str, string trimStr, bool ignoreCase = true)
{
str = ConvertHelper.GetString(str);
trimStr = ConvertHelper.GetString(trimStr);
while (str.EndsWith(trimStr, ignoreCase, CultureInfo.CurrentCulture))
{
str = str.Substring(0, str.Length - trimStr.Length);
}
return str;
}
///
/// 移除前导和后导字符串
///
public static string Trim(string str, string trimStr = " ", bool ignoreCase = true)
{
return TrimStart(TrimEnd(str, trimStr, ignoreCase), trimStr, ignoreCase);
}
#endregion
#region 字符串相似度比较
///
/// 计算字符相似度
///
///
///
///
private static int Levenshtein_Distance(string str1, string str2)
{
int[,] Matrix;
int n = str1.Length;
int m = str2.Length;
int temp = 0;
char ch1;
char ch2;
int i = 0;
int j = 0;
if (n == 0)
{
return m;
}
if (m == 0)
{
return n;
}
Matrix = new int[n + 1, m + 1];
for (i = 0; i <= n; i++)
{
//初始化第一列
Matrix[i, 0] = i;
}
for (j = 0; j <= m; j++)
{
//初始化第一行
Matrix[0, j] = j;
}
for (i = 1; i <= n; i++)
{
ch1 = str1[i - 1];
for (j = 1; j <= m; j++)
{
ch2 = str2[j - 1];
if (ch1.Equals(ch2))
{
temp = 0;
}
else
{
temp = 1;
}
Matrix[i, j] = new int[] { Matrix[i - 1, j] + 1, Matrix[i, j - 1] + 1, Matrix[i - 1, j - 1] + temp }.Min();
}
}
return Matrix[n, m];
}
///
/// 计算字符串相似度
///
///
///
///
public static decimal LevenshteinDistancePercent(string str1, string str2)
{
int val = Levenshtein_Distance(str1, str2);
return 1 - (decimal)val / new int[] { str1.Length, str2.Length }.Max();
}
#endregion
#region 计算匹配率/相似度
///
/// 计算相似度。
///
public static SimilarityResult SimilarityRate(string str1, string str2)
{
var result = new SimilarityResult();
var arrChar1 = str1.ToCharArray();
var arrChar2 = str2.ToCharArray();
var computeTimes = 0;
var row = arrChar1.Length + 1;
var column = arrChar2.Length + 1;
var matrix = new int[row, column];
//初始化矩阵的第一行和第一列
for (var i = 0; i < column; i++)
{
matrix[0, i] = i;
}
for (var i = 0; i < row; i++)
{
matrix[i, 0] = i;
}
for (var i = 1; i < row; i++)
{
for (var j = 1; j < column; j++)
{
var intCost = 0;
intCost = arrChar1[i - 1] == arrChar2[j - 1] ? 0 : 1;
//关键步骤,计算当前位置值为左边+1、上面+1、左上角+intCost中的最小值
//循环遍历到最后_Matrix[_Row - 1, _Column - 1]即为两个字符串的距离
matrix[i, j] = new int[] { matrix[i - 1, j] + 1, matrix[i, j - 1] + 1, matrix[i - 1, j - 1] + intCost }.Min();
computeTimes++;
}
}
//相似率 移动次数小于最长的字符串长度的20%算同一题
var intLength = row > column ? row : column;
//_Result.Rate = (1 - (double)_Matrix[_Row - 1, _Column - 1] / intLength).ToString().Substring(0, 6);
result.Rate = (1 - (double)matrix[row - 1, column - 1] / (intLength - 1));
result.ComputeTimes = computeTimes.ToString() + " 距离为:" + matrix[row - 1, column - 1].ToString();
return result;
}
///
/// 计算结果
///
public struct SimilarityResult
{
///
/// 相似度,0.54即54%。
///
public double Rate;
///
/// 对比次数
///
public string ComputeTimes;
}
#endregion
}
}