找出2个字符串的差异
Finding the difference in 2 strings
我在 PowerPoint 中有 2 个文本框。一份原创,一份编辑。我将它们串起来并将它们分别分解成一个数组。然后我比较它们是否有任何差异。例如,我的原始文本框有 "This New",而我的编辑文本框有 "Thisss Blaa",然后输出为 "This Thisss New Blaa"。但是,当我原来的 TextBox 有两次相同的词时,例如"This This" 我的输出是 "This Thiss Blaa" 而它应该是 "This Thiss This Blaa"。只有当我在一个字符串中有 2 个相同的单词时才会发生这种情况。有没有人知道如何解决这个问题?
我的代码如下
var q = from original in originalList
join editedTmp in editList on original.Id equals editedTmp.Id into g
from edited in g.DefaultIfEmpty()
select new
{
original,
edited
};
foreach (var item in q)
{
char delimiter = Convert.ToChar(" ");
var originalString = item.original.TextFrame.TextRange.Text;
var editString = item.edited.TextFrame.TextRange.Text;
var firstStringList = originalString.Split(delimiter).ToList();
var secondStringList = editString.Split(delimiter).ToList();
foreach (var word in firstStringList)
{
if (secondStringList.IndexOf(word) == -1)
{
var indexOfWord = firstStringList.IndexOf(word); //gets the position of the edited word eg. 3.
// using indexOfWord+indexOfWord as I need do this if more than one word is added.
secondStringList.Insert(indexOfWord + indexOfWord, word);
// Insert the word that was not found at position 3 inside secondStringList
one.Add(word);
}
}
所以,我想你想要:
字符串 1:This This
字符串 2:Thisss blaa
结果:This Thisss This Blaa
.
我实现这一点的最简单方法是:
var first = "This This";
var second = "Thisss blaa";
var firstSplit = first.SplitBySpace();
var secondSplit = second.SplitBySpace();
var result = string.Join(" ", firstSplit.Zip(secondSplit, (firstString, secondString) => firstString + " " + secondString));
// result = "This Thisss This Blaa"
SplitBySpace
是这样的:
public static class StringExtensions
{
public static IEnumerable<string> SplitBySpace(this string value)
{
return value.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
}
}
说明
.Zip
接受两个数组并将相同位置的每个元素连接在一起。所以相当于做:
for (var i = 0; i < arr1.Length; i++)
{
var newElement = arr1[i] + arr2[i]
arr3[i] = newElement;
}
// arr1.Length = 10, arr2.Length = 10;
// arr3.Length = 10!
但是,使用 .Zip()
的第二个参数,您可以定义创建新元素的方式。
整合
var q = from original in originalList
join editedTmp in editList on original.Id equals editedTmp.Id into g
from edited in g.DefaultIfEmpty()
select new
{
original,
edited
};
foreach (var item in q)
{
var originalString = item.original.TextFrame.TextRange.Text;
var editString = item.edited.TextFrame.TextRange.Text;
var firstSplit = originalString .SplitBySpace();
var secondSplit = editString .SplitBySpace();
var result = string.Join(" ", firstSplit.Zip(secondSplit, (firstString, secondString) => firstString + " " + secondString));
Console.WriteLine(result);
}
我在 PowerPoint 中有 2 个文本框。一份原创,一份编辑。我将它们串起来并将它们分别分解成一个数组。然后我比较它们是否有任何差异。例如,我的原始文本框有 "This New",而我的编辑文本框有 "Thisss Blaa",然后输出为 "This Thisss New Blaa"。但是,当我原来的 TextBox 有两次相同的词时,例如"This This" 我的输出是 "This Thiss Blaa" 而它应该是 "This Thiss This Blaa"。只有当我在一个字符串中有 2 个相同的单词时才会发生这种情况。有没有人知道如何解决这个问题?
我的代码如下
var q = from original in originalList
join editedTmp in editList on original.Id equals editedTmp.Id into g
from edited in g.DefaultIfEmpty()
select new
{
original,
edited
};
foreach (var item in q)
{
char delimiter = Convert.ToChar(" ");
var originalString = item.original.TextFrame.TextRange.Text;
var editString = item.edited.TextFrame.TextRange.Text;
var firstStringList = originalString.Split(delimiter).ToList();
var secondStringList = editString.Split(delimiter).ToList();
foreach (var word in firstStringList)
{
if (secondStringList.IndexOf(word) == -1)
{
var indexOfWord = firstStringList.IndexOf(word); //gets the position of the edited word eg. 3.
// using indexOfWord+indexOfWord as I need do this if more than one word is added.
secondStringList.Insert(indexOfWord + indexOfWord, word);
// Insert the word that was not found at position 3 inside secondStringList
one.Add(word);
}
}
所以,我想你想要:
字符串 1:This This
字符串 2:Thisss blaa
结果:This Thisss This Blaa
.
我实现这一点的最简单方法是:
var first = "This This";
var second = "Thisss blaa";
var firstSplit = first.SplitBySpace();
var secondSplit = second.SplitBySpace();
var result = string.Join(" ", firstSplit.Zip(secondSplit, (firstString, secondString) => firstString + " " + secondString));
// result = "This Thisss This Blaa"
SplitBySpace
是这样的:
public static class StringExtensions
{
public static IEnumerable<string> SplitBySpace(this string value)
{
return value.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
}
}
说明
.Zip
接受两个数组并将相同位置的每个元素连接在一起。所以相当于做:
for (var i = 0; i < arr1.Length; i++)
{
var newElement = arr1[i] + arr2[i]
arr3[i] = newElement;
}
// arr1.Length = 10, arr2.Length = 10;
// arr3.Length = 10!
但是,使用 .Zip()
的第二个参数,您可以定义创建新元素的方式。
整合
var q = from original in originalList
join editedTmp in editList on original.Id equals editedTmp.Id into g
from edited in g.DefaultIfEmpty()
select new
{
original,
edited
};
foreach (var item in q)
{
var originalString = item.original.TextFrame.TextRange.Text;
var editString = item.edited.TextFrame.TextRange.Text;
var firstSplit = originalString .SplitBySpace();
var secondSplit = editString .SplitBySpace();
var result = string.Join(" ", firstSplit.Zip(secondSplit, (firstString, secondString) => firstString + " " + secondString));
Console.WriteLine(result);
}