我有两个字符串
string a = "foo bar";
string b = "bar foo";
我希望检测从a
到b
的变化。为了从a
到b
,我需要更改哪些字符呢?
我认为必须遍历每个字符,并检测它是添加、删除还是保持不变。因此,这是我的预期结果。
'f' Remove
'o' Remove
'o' Remove
' ' Remove
'b' Equal
'a' Equal
'r' Equal
' ' Add
'f' Add
'o' Add
'o' Add
结果的类和枚举:
public enum Operation { Add,Equal,Remove };
public class Difference
{
public Operation op { get; set; }
public char c { get; set; }
}
这是我的解决方案,但“删除”情况对我来说不太清楚代码应该是什么样子的。
public static List<Difference> CalculateDifferences(string left, string right)
{
int count = 0;
List<Difference> result = new List<Difference>();
foreach (char ch in left)
{
int index = right.IndexOf(ch, count);
if (index == count)
{
count++;
result.Add(new Difference() { c = ch, op = Operation.Equal });
}
else if (index > count)
{
string add = right.Substring(count, index - count);
result.AddRange(add.Select(x => new Difference() { c = x, op = Operation.Add }));
count += add.Length;
}
else
{
//Remove?
}
}
return result;
}
代码在删除字符时应该是什么样子的?
更新 - 添加了更多示例
示例1:
string a = "foobar";
string b = "fooar";
期望结果:
'f' Equal
'o' Equal
'o' Equal
'b' Remove
'a' Equal
'r' Equal
例子2:
string a = "asdfghjk";
string b = "wsedrftr";
预期结果:
'a' Remove
'w' Add
's' Equal
'e' Add
'd' Equal
'r' Add
'f' Equal
'g' Remove
'h' Remove
'j' Remove
'k' Remove
't' Add
'r' Add
更新:
这里是Dmitry和ingen答案的比较:https://dotnetfiddle.net/MJQDAO
string A = "foobar", string B = "fooar"
?索引3被删除了,还是索引3从“b”变成了“a”,4从“a”变成了“r”,并且索引5被删除了?除非您定义一些规则来评估这种情况,否则我们无法帮助您。 - JMadelaine