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