Как отображать различия слов с помощью с #?

Я хотел бы показать различия между двумя блоками текста. Вместо того, чтобы сравнивать строки текста или отдельные символы, я хотел бы просто сравнить слова, разделенные указанными символами (например, '\ n', '', '\ t'). Моя основная причина этого заключается в том, что в блоке текста, который я буду сравнивать, обычно не так много разрывов строки, и сравнение букв может быть трудным.

Я столкнулся со следующей логикой O (ND) в C # для сравнения строк и символов, но я Я как бы не понимаю, как изменить его для сравнения слов.

Кроме того, я хотел бы отслеживать разделители между словами и убедиться, что они включены в разницу. Итак, если пробел заменяется жестким возвратом, я бы хотел, чтобы это появилось как diff.

Я использую Asp.Net (c #) для отображения всего блока текста, включая удаленный исходный текст и добавленный новый текст (оба будут выделены, чтобы показать, что они были удалены / добавлены). Было бы признательно за решение, которое работает с этими технологиями.

Любые советы о том, как это сделать, приветствуются.


person Jim Geurts    schedule 19.12.2009    source источник
comment
Развлекайся. Мой коллега должен был сделать это для выпуска нашей флагманской линейки продуктов. Это ему достаточно бросило вызов. И он использовал несколько теоретических работ, чтобы руководствоваться своей работой ... все время сомневаясь в качестве написанного.   -  person Jason D    schedule 21.12.2009


Ответы (4)


Microsoft выпустила проект сравнения на CodePlex, который позволяет вам выполнять сравнение слов, символов и строк. Он находится под лицензией Microsoft Public License (Ms-PL).

https://github.com/mmanela/diffplex

person Jim Geurts    schedule 12.01.2010
comment
DiffPlex позволяет вам определить пользовательскую функцию для разделения текста перед его различением. Вы можете использовать метод: DiffResult CreateCustomDiffs (string oldText, string newText, bool ignoreWhiteSpace, Func ‹string, string []› chunker), где chunker сообщает DiffPlex, какие атомарные единицы сравнивать друг с другом. - person Matthew Manela; 23.04.2010
comment
Привет, Джим, я ищу аналогичное решение, хотел бы узнать ваше мнение, если вы используете diffplex, поскольку решена ваша проблема? - person CHash_Mike; 15.11.2013
comment
Похоже, я использовал codeproject .com / Articles / 11454 / для моего решения. Я не помню, почему я использовал его поверх diffplex, tbh. Это решение объединяет удаленные и добавленные слова в определенные теги HTML, что позволяет вам стилизовать их по своему усмотрению. - person Jim Geurts; 16.11.2013

Помимо нескольких общих оптимизаций, если вам нужно включить разделители в сравнение, вы, по сути, выполняете сравнение символов по символам с разрывами. Хотя вы можете использовать связанный O (ND), вы собираетесь внести в него столько же изменений, сколько вы бы написали свои собственные.

Основная проблема при сравнении различий - это поиск продолжения (если я удалю одно слово, а все остальное оставлю без изменений).

Если вы хотите использовать их код, начните с примера и не записывайте удаленные символы, если в том же месте есть замененные символы, не выводите этот результат. Затем вам нужно вычислить самый длинный непрерывный цикл «измененных» слов, выделить эту строку и вывести.

Извините, это не большой ответ, но для этой проблемы ответ в основном заключается в написании и настройке функции.

person GrayWizardx    schedule 19.12.2009

Хорошо, String.Split с '\ n', '' и '\ t ', поскольку разделенные символы вернут вам массив слов в вашем блоке текста.

Затем вы можете сравнить каждый массив на предмет различий. Простое сравнение 1: 1 скажет вам, было ли изменено какое-либо слово. Сравнение:

hello world how are you

и:

hello there how are you

даст вам это world и изменит на there.

Он не сказал бы вам, были ли слова вставлены или удалены, и вам все равно нужно будет анализировать текстовые блоки символ за символом, чтобы увидеть, был ли изменен какой-либо из разделительных символов.

person ChrisF    schedule 19.12.2009
comment
Боюсь, что String.Split для больших блоков текста будет неэффективным. - person Vadym Stetsiak; 21.12.2009

строка 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();
person Monali Pawar    schedule 23.05.2018