Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 逐字比较差异和显示更改_C#_Asp.net Mvc_Levenshtein Distance_String Metric - Fatal编程技术网

C# 逐字比较差异和显示更改

C# 逐字比较差异和显示更改,c#,asp.net-mvc,levenshtein-distance,string-metric,C#,Asp.net Mvc,Levenshtein Distance,String Metric,可能被标记为重复,但我还没有找到一个支持解决方案 我需要编写一个函数,逐字比较两段文本,并打印出显示添加/删除/更改单词的文本。例如: StringOriginal=“我是蒂姆,今年27岁” StringEdited=“我是金姆,我没有那么老” 结果:我是蒂姆金,27岁没有那么大 我发现的大多数diff算法都倾向于逐字符比较。这很好,直到你在同一索引上有两个不同的单词,并且有共同的字符 “我是蒂姆”编辑成 “我是金” 结果分为: 我是金姆 而不是 我是蒂姆·金 有什么建议吗 按空间拆分Strin

可能被标记为重复,但我还没有找到一个支持解决方案

我需要编写一个函数,逐字比较两段文本,并打印出显示添加/删除/更改单词的文本。例如:

StringOriginal=“我是蒂姆,今年27岁”

StringEdited=“我是金姆,我没有那么老”

结果:我是蒂姆金,27岁没有那么大

我发现的大多数diff算法都倾向于逐字符比较。这很好,直到你在同一索引上有两个不同的单词,并且有共同的字符

“我是蒂姆”编辑成 “我是金” 结果分为:

我是金姆

而不是

我是蒂姆·金


有什么建议吗

按空间拆分StringOriginal和StringEdit。循环遍历StringOriginal的每个单词,并将其与编辑的相同单词索引进行比较。每个不相等的字都应该放在一个临时变量中,并且只有当您从循环中再次获得相等的字时,才将它连接到结果中。使用StringBuilder创建结果。希望这有助于按空间拆分StringOriginal和StringEdit。循环遍历StringOriginal的每个单词,并将其与编辑的相同单词索引进行比较。每个不相等的字都应该放在一个临时变量中,并且只有当您从循环中再次获得相等的字时,才将它连接到结果中。使用StringBuilder创建结果。希望这有助于

按空格拆分两个字符串,通过Union连接生成的数组,然后返回如下字符串:

string[] arr1 = str1.Split(' ');
string[] arr2 = str1.Split(' ');

var merged = arr1.Union(arr2).ToArray<string>();

var mergedString = string.Join(' ', merged);
string[]arr1=str1.Split(“”);
字符串[]arr2=str1.Split(“”);
var merged=arr1.Union(arr2.ToArray();
var mergedString=string.Join(“”,merged);

按空格拆分两个字符串,通过Union连接生成的数组,然后返回如下字符串:

string[] arr1 = str1.Split(' ');
string[] arr2 = str1.Split(' ');

var merged = arr1.Union(arr2).ToArray<string>();

var mergedString = string.Join(' ', merged);
string[]arr1=str1.Split(“”);
字符串[]arr2=str1.Split(“”);
var merged=arr1.Union(arr2.ToArray();
var mergedString=string.Join(“”,merged);

有点过时,但你可以试试这个

    string StringOriginal = "I am Tim and I am 27 years old";
    string StringEdited = "I am Kim and I am not that old";

    string[] StringOriginalArray = StringOriginal.Split();
    string[] StringEditedArray = StringEdited.Split();
    string[] newStringArray = new string[StringOriginalArray.Length + StringEditedArray.Length];

    int i = 0;
    int io = 0;
    int ie = 0;

    while (i < newStringArray.Length)
    {
        if (io < StringOriginalArray.Length)
        {
            newStringArray[i] = StringOriginalArray[io];
            io++;
            i++;
        }
        if (ie < StringEditedArray.Length)
        {
            newStringArray[i] = StringEditedArray[ie];
            ie++;
            i++;
        }
    }

    string[] finalArray = new string[newStringArray.Length];
    int f = 0;
    for (int k = 0; k < newStringArray.Length; k=k+2)
    {
        finalArray[f++] = newStringArray[k];
        if (newStringArray[k] != newStringArray[k+1])
        {
            finalArray[f++] = newStringArray[k+1];
        }
    }

    Console.WriteLine(String.Join(" ", finalArray));

有点过时,但你可以试试这个

    string StringOriginal = "I am Tim and I am 27 years old";
    string StringEdited = "I am Kim and I am not that old";

    string[] StringOriginalArray = StringOriginal.Split();
    string[] StringEditedArray = StringEdited.Split();
    string[] newStringArray = new string[StringOriginalArray.Length + StringEditedArray.Length];

    int i = 0;
    int io = 0;
    int ie = 0;

    while (i < newStringArray.Length)
    {
        if (io < StringOriginalArray.Length)
        {
            newStringArray[i] = StringOriginalArray[io];
            io++;
            i++;
        }
        if (ie < StringEditedArray.Length)
        {
            newStringArray[i] = StringEditedArray[ie];
            ie++;
            i++;
        }
    }

    string[] finalArray = new string[newStringArray.Length];
    int f = 0;
    for (int k = 0; k < newStringArray.Length; k=k+2)
    {
        finalArray[f++] = newStringArray[k];
        if (newStringArray[k] != newStringArray[k+1])
        {
            finalArray[f++] = newStringArray[k+1];
        }
    }

    Console.WriteLine(String.Join(" ", finalArray));

我一直在寻找这个问题的答案。 还没有找到一个好的解决办法。 我得出了以下结论。但这并不完美

    public static class DiffEngine
    {
        private static Regex r = new Regex(@"(?<=[\s])", RegexOptions.Compiled);

        public static string Process(ref string TextA, ref string TextB)
        {
            var A = r.Split(TextA);
            var B = r.Split(TextB);
            var max = Math.Max(A.Count(), B.Count());
            var sbDel = new StringBuilder("<del>");
            var sbIns = new StringBuilder("<ins>");
            var sbOutput = new StringBuilder();
            var aCurr = string.Empty;
            var bCurr = string.Empty;
            var aNext = string.Empty;
            var bNext = string.Empty;

            for (int i = 0; i < max; i++)
            {
                aCurr = (i > A.Count() - 1) ? string.Empty : A[i];
                bCurr = (i > B.Count() - 1) ? string.Empty : B[i];
                aNext = (i > A.Count() - 2) ? string.Empty : A[i + 1];
                bNext = (i > B.Count() - 2) ? string.Empty : B[i + 1];

                if (aCurr == bCurr)
                {
                    sbOutput.Append(aCurr);
                }
                else
                {
                    if (aNext != bNext)
                    {
                        sbDel.Append(aCurr);
                        sbIns.Append(bCurr);
                    }
                    else
                    {
                        sbDel.Append(aCurr);
                        sbIns.Append(bCurr);
                        sbOutput
                            .Append(sbDel.ToString())
                            .Append("</del>")
                            .Append(sbIns.ToString())
                            .Append("</ins>");
                        sbDel.Clear().Append("<del>");
                        sbIns.Clear().Append("<ins>");
                    }
                }
            }

            A = null;
            B = null;
            sbDel = null;
            sbIns = null;
            return sbOutput.ToString();

        }
    }
publicstaticclass-differengine
{

private static Regex r=new Regex(@)(?我一直在寻找这个问题的答案。 还没有找到一个好的解决办法。 我得出了以下结论,但并不完美

    public static class DiffEngine
    {
        private static Regex r = new Regex(@"(?<=[\s])", RegexOptions.Compiled);

        public static string Process(ref string TextA, ref string TextB)
        {
            var A = r.Split(TextA);
            var B = r.Split(TextB);
            var max = Math.Max(A.Count(), B.Count());
            var sbDel = new StringBuilder("<del>");
            var sbIns = new StringBuilder("<ins>");
            var sbOutput = new StringBuilder();
            var aCurr = string.Empty;
            var bCurr = string.Empty;
            var aNext = string.Empty;
            var bNext = string.Empty;

            for (int i = 0; i < max; i++)
            {
                aCurr = (i > A.Count() - 1) ? string.Empty : A[i];
                bCurr = (i > B.Count() - 1) ? string.Empty : B[i];
                aNext = (i > A.Count() - 2) ? string.Empty : A[i + 1];
                bNext = (i > B.Count() - 2) ? string.Empty : B[i + 1];

                if (aCurr == bCurr)
                {
                    sbOutput.Append(aCurr);
                }
                else
                {
                    if (aNext != bNext)
                    {
                        sbDel.Append(aCurr);
                        sbIns.Append(bCurr);
                    }
                    else
                    {
                        sbDel.Append(aCurr);
                        sbIns.Append(bCurr);
                        sbOutput
                            .Append(sbDel.ToString())
                            .Append("</del>")
                            .Append(sbIns.ToString())
                            .Append("</ins>");
                        sbDel.Clear().Append("<del>");
                        sbIns.Clear().Append("<ins>");
                    }
                }
            }

            A = null;
            B = null;
            sbDel = null;
            sbIns = null;
            return sbOutput.ToString();

        }
    }
publicstaticclass-differengine
{

private static Regex r=new Regex(@)(?谢谢,让我开始了!谢谢,让我开始了!这很有效!我只需要编辑它,在我的asp.net应用程序中以绿色/红色突出显示添加/删除的单词!谢谢!这很有效!我只需要编辑它,在我的asp.net应用程序中以绿色/红色突出显示添加/删除的单词!谢谢!