Как отобразить различия слов с помощью C #? - PullRequest
18 голосов
/ 20 декабря 2009

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

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

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

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

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

Ответы [ 4 ]

17 голосов
/ 13 января 2010

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

https://github.com/mmanela/diffplex

1 голос
/ 20 декабря 2009

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

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

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

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

0 голосов
/ 23 мая 2018

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();
0 голосов
/ 20 декабря 2009

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

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

hello world how are you

и

hello there how are you

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

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

...