c#字符相似度对比通用类

简介: 本类适用于比较2个字符的相似度,代码如下: View Code using System; using System.Collections.Generic; using System.

本类适用于比较2个字符的相似度,代码如下:

View Code
using System;
using System.Collections.Generic;
using System.Text;

public class StringCompute
{
    #region 私有变量
    /// <summary>
    /// 字符串1
    /// </summary>
    private char[] _ArrChar1;
    /// <summary>
    /// 字符串2
    /// </summary>
    private char[] _ArrChar2;
    /// <summary>
    /// 统计结果
    /// </summary>
    private Result _Result;
    /// <summary>
    /// 开始时间
    /// </summary>
    private DateTime _BeginTime;
    /// <summary>
    /// 结束时间
    /// </summary>
    private DateTime _EndTime;
    /// <summary>
    /// 计算次数
    /// </summary>
    private int _ComputeTimes;
    /// <summary>
    /// 算法矩阵
    /// </summary>
    private int[,] _Matrix;
    /// <summary>
    /// 矩阵列数
    /// </summary>
    private int _Column;
    /// <summary>
    /// 矩阵行数
    /// </summary>
    private int _Row;
    #endregion
    #region 属性
    public Result ComputeResult
    {
        get { return _Result; }
    }
    #endregion
    #region 构造函数
    public StringCompute(string str1, string str2)
    {
        this.StringComputeInit(str1, str2);
    }
    public StringCompute()
    {
    }
    #endregion
    #region 算法实现
    /// <summary>
    /// 初始化算法基本信息
    /// </summary>
    /// <param name="str1">字符串1</param>
    /// <param name="str2">字符串2</param>
    private void StringComputeInit(string str1, string str2)
    {
        _ArrChar1 = str1.ToCharArray();
        _ArrChar2 = str2.ToCharArray();
        _Result = new Result();
        _ComputeTimes = 0;
        _Row = _ArrChar1.Length + 1;
        _Column = _ArrChar2.Length + 1;
        _Matrix = new int[_Row, _Column];
    }
    /// <summary>
    /// 计算相似度
    /// </summary>
    public void Compute()
    {
        //开始时间
        _BeginTime = DateTime.Now;
        //初始化矩阵的第一行和第一列
        this.InitMatrix();
        int intCost = 0;
        for (int i = 1; i < _Row; i++)
        {
            for (int j = 1; j < _Column; j++)
            {
                if (_ArrChar1[i - 1] == _ArrChar2[j - 1])
                {
                    intCost = 0;
                }
                else
                {
                    intCost = 1;
                }
                //关键步骤,计算当前位置值为左边+1、上面+1、左上角+intCost中的最小值 
                //循环遍历到最后_Matrix[_Row - 1, _Column - 1]即为两个字符串的距离
                _Matrix[i, j] = this.Minimum(_Matrix[i - 1, j] + 1, _Matrix[i, j - 1] + 1, _Matrix[i - 1, j - 1] + intCost);
                _ComputeTimes++;
            }
        }
        //结束时间
        _EndTime = DateTime.Now;
        //相似率 移动次数小于最长的字符串长度的20%算同一题
        int intLength = _Row > _Column ? _Row : _Column;

        _Result.Rate = (1 - (decimal)_Matrix[_Row - 1, _Column - 1] / intLength);
        _Result.UseTime = (_EndTime - _BeginTime).ToString();
        _Result.ComputeTimes = _ComputeTimes.ToString();
        _Result.Difference = _Matrix[_Row - 1, _Column - 1];
    }


    /// <summary>
    /// 计算相似度(不记录比较时间)
    /// </summary>
    public void SpeedyCompute()
    {
        //开始时间
        //_BeginTime = DateTime.Now;
        //初始化矩阵的第一行和第一列
        this.InitMatrix();
        int intCost = 0;
        for (int i = 1; i < _Row; i++)
        {
            for (int j = 1; j < _Column; j++)
            {
                if (_ArrChar1[i - 1] == _ArrChar2[j - 1])
                {
                    intCost = 0;
                }
                else
                {
                    intCost = 1;
                }
                //关键步骤,计算当前位置值为左边+1、上面+1、左上角+intCost中的最小值 
                //循环遍历到最后_Matrix[_Row - 1, _Column - 1]即为两个字符串的距离
                _Matrix[i, j] = this.Minimum(_Matrix[i - 1, j] + 1, _Matrix[i, j - 1] + 1, _Matrix[i - 1, j - 1] + intCost);
                _ComputeTimes++;
            }
        }
        //结束时间
        //_EndTime = DateTime.Now;
        //相似率 移动次数小于最长的字符串长度的20%算同一题
        int intLength = _Row > _Column ? _Row : _Column;

        _Result.Rate = (1 - (decimal)_Matrix[_Row - 1, _Column - 1] / intLength);
        // _Result.UseTime = (_EndTime - _BeginTime).ToString();
        _Result.ComputeTimes = _ComputeTimes.ToString();
        _Result.Difference = _Matrix[_Row - 1, _Column - 1];
    }
    /// <summary>
    /// 计算相似度
    /// </summary>
    /// <param name="str1">字符串1</param>
    /// <param name="str2">字符串2</param>
    public void Compute(string str1, string str2)
    {
        this.StringComputeInit(str1, str2);
        this.Compute();
    }

    /// <summary>
    /// 计算相似度
    /// </summary>
    /// <param name="str1">字符串1</param>
    /// <param name="str2">字符串2</param>
    public void SpeedyCompute(string str1, string str2)
    {
        this.StringComputeInit(str1, str2);
        this.SpeedyCompute();
    }
    /// <summary>
    /// 初始化矩阵的第一行和第一列
    /// </summary>
    private void InitMatrix()
    {
        for (int i = 0; i < _Column; i++)
        {
            _Matrix[0, i] = i;
        }
        for (int i = 0; i < _Row; i++)
        {
            _Matrix[i, 0] = i;
        }
    }
    /// <summary>
    /// 取三个数中的最小值
    /// </summary>
    /// <param name="First"></param>
    /// <param name="Second"></param>
    /// <param name="Third"></param>
    /// <returns></returns>
    private int Minimum(int First, int Second, int Third)
    {
        int intMin = First;
        if (Second < intMin)
        {
            intMin = Second;
        }
        if (Third < intMin)
        {
            intMin = Third;
        }
        return intMin;
    }
    #endregion
}
/// <summary>
/// 计算结果
/// </summary>
public struct Result
{
    /// <summary>
    /// 相似度
    /// </summary>
    public decimal Rate;
    /// <summary>
    /// 对比次数
    /// </summary>
    public string ComputeTimes;
    /// <summary>
    /// 使用时间
    /// </summary>
    public string UseTime;
    /// <summary>
    /// 差异
    /// </summary>
    public int Difference;
}

调用方法:

// 方式一
StringCompute stringcompute1 = new StringCompute();
stringcompute1.SpeedyCompute("对比字符一", "对比字符二");    // 计算相似度, 不记录比较时间
decimal rate = stringcompute1.ComputeResult.Rate;         // 相似度百分之几,完全匹配相似度为1

// 方式二
StringCompute stringcompute2 = new StringCompute();
stringcompute2.Compute();                                  // 计算相似度, 记录比较时间
string usetime = stringcompute2.ComputeResult.UseTime;     // 对比使用时间

 

 

img_fa0be433d68c8212b2b0b3b1a564ccb1.png
如果本文对你有所帮助,请打赏——1元就足够感动我:)
支付宝打赏 微信打赏
联系邮箱:intdb@qq.com
我的GitHub: https://github.com/vipstone
关注公众号: img_9bde0f31ac4a0eca10b1bd7414b78faf.png


作者: 王磊
出处: http://vipstone.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,请标明出处。

相关文章
|
2月前
|
开发框架 .NET C#
C#|.net core 基础 - 删除字符串最后一个字符的七大类N种实现方式
【10月更文挑战第9天】在 C#/.NET Core 中,有多种方法可以删除字符串的最后一个字符,包括使用 `Substring` 方法、`Remove` 方法、`ToCharArray` 与 `Array.Copy`、`StringBuilder`、正则表达式、循环遍历字符数组以及使用 LINQ 的 `SkipLast` 方法。
|
3月前
|
存储 C# 索引
C# 一分钟浅谈:数组与集合类的基本操作
【9月更文挑战第1天】本文详细介绍了C#中数组和集合类的基本操作,包括创建、访问、遍历及常见问题的解决方法。数组适用于固定长度的数据存储,而集合类如`List<T>`则提供了动态扩展的能力。文章通过示例代码展示了如何处理索引越界、数组长度不可变及集合容量不足等问题,并提供了解决方案。掌握这些基础知识可使程序更加高效和清晰。
86 2
|
3月前
|
开发框架 .NET 程序员
C# 去掉字符串最后一个字符的 4 种方法
在实际业务中,我们经常会遇到在循环中拼接字符串的场景,循环结束之后拼接得到的字符串的最后一个字符往往需要去掉,看看 C# 提供了哪4种方法可以高效去掉字符串的最后一个字符
348 0
|
2月前
|
Java 程序员 C#
【类的应用】C#应用之派生类构造方法给基类构造方法传参赋值
【类的应用】C#应用之派生类构造方法给基类构造方法传参赋值
14 0
|
3月前
|
C# 数据安全/隐私保护
C# 一分钟浅谈:类与对象的概念理解
【9月更文挑战第2天】本文从零开始详细介绍了C#中的类与对象概念。类作为一种自定义数据类型,定义了对象的属性和方法;对象则是类的实例,拥有独立的状态。通过具体代码示例,如定义 `Person` 类及其实例化过程,帮助读者更好地理解和应用这两个核心概念。此外,还总结了常见的问题及解决方法,为编写高质量的面向对象程序奠定基础。
28 2
|
4月前
|
C#
C#中的类和继承
C#中的类和继承
44 6
|
4月前
|
Java C# 索引
C# 面向对象编程(一)——类
C# 面向对象编程(一)——类
35 0
|
4月前
|
开发框架 .NET 编译器
C# 中的记录(record)类型和类(class)类型对比总结
C# 中的记录(record)类型和类(class)类型对比总结
|
6月前
|
存储 安全 C#
C# 类的深入指南
C# 类的深入指南
|
1月前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
35 3