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

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

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

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

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

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

4 ответа

Решение

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

https://github.com/mmanela/diffplex

Помимо нескольких общих оптимизаций, если вам нужно включить разделители в сравнение, вы, по сути, делаете посимвольное сравнение с разрывами. Хотя вы можете использовать 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();
Другие вопросы по тегам