Как отобразить различия слов с помощью C#?
Я хотел бы показать различия между двумя блоками текста. Вместо того, чтобы сравнивать строки текста или отдельные символы, я хотел бы просто сравнить слова, разделенные указанными символами (например, '\ n', '', '\ t'). Моя главная причина этого заключается в том, что блок текста, который я буду сравнивать, обычно не содержит много разрывов строк, и сравнение букв может быть трудным для понимания.
Я сталкивался со следующей логикой O(ND) в C# для сравнения строк и символов, но я вроде в недоумении, как изменить ее для сравнения слов.
Кроме того, я хотел бы отслеживать разделители между словами и убедиться, что они включены в diff. Так что если пробел заменить жестким возвратом, я бы хотел, чтобы это выглядело как diff.
Я использую Asp.Net (C#) для отображения всего блока текста, включая удаленный оригинальный текст и добавленный новый текст (оба будут выделены, чтобы показать, что они были удалены / добавлены). Решение, которое работает с этими технологиями, будет оценено.
Любой совет, как это сделать, приветствуется.
4 ответа
Microsoft выпустила проект diff для CodePlex, который позволяет вам выполнять различие в словах, символах и строках. Он лицензируется в рамках Microsoft Public License (Ms-PL).
Помимо нескольких общих оптимизаций, если вам нужно включить разделители в сравнение, вы, по сути, делаете посимвольное сравнение с разрывами. Хотя вы можете использовать O(ND), с которым вы связаны, вы будете вносить в него столько же изменений, сколько и в основном при написании своего.
Основная проблема сравнения различий заключается в нахождении продолжения (если я удалю одно слово, а остальное оставлю без изменений).
Если вы хотите использовать их код, начните с примера и не пишите удаленные символы, если замененные символы находятся в одном месте, не выводите этот результат. Затем вам нужно вычислить самый длинный непрерывный цикл "измененных" слов, выделить эту строку и вывести.
Извините, это не большой ответ, но для этой проблемы ответ в основном написание и настройка функции.
Что ж String.Split
с '\n', ' ' и '\t' в качестве разделенных символов вы получите массив слов в вашем блоке текста.
Затем вы можете сравнить каждый массив на предмет различий. Простое сравнение 1:1 скажет вам, было ли изменено какое-либо слово. Сравнение:
hello world how are you
а также:
hello there how are you
даст вам это world
и изменился на there
,
То, что он не сказал бы вам, было бы, если бы слова были вставлены или удалены, и вам все равно нужно будет анализировать текстовые блоки символ за символом, чтобы увидеть, был ли изменен какой-либо из символов-разделителей.
string string1 = "Привет, мир, как дела"; string string2 = "привет, как дела";
var first = string1.Split(' ');
var second = string2.Split(' ');
var primary = first.Length > second.Length ? first : second;
var secondary = primary == second ? first : second;
var difference = primary.Except(secondary).ToArray();