У меня 2 строки
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
Обновить:
Вот сравнение между Дмитрием и Инном: https://dotnetfiddle.net/MJQDAO