DiffPlex : génération de diffs textuels pour .NET

Bibliothèque .NET pour comparer des textes et produire des diffs en modes inline, côte-à-côte (side-by-side) ou unifiés (unidiff).

Démarrage rapide (inline)

using DiffPlex.DiffBuilder;
using DiffPlex.DiffBuilder.Model;

var diff = InlineDiffBuilder.Diff(before, after);
foreach (var line in diff.Lines)
{
    switch (line.Type)
    {
        case ChangeType.Inserted:
            Console.Write("+ " );
            break;
        case ChangeType.Deleted:
            Console.Write("- " );
            break;
        default:
            Console.Write("  " );
            break;
    }
    Console.WriteLine(line.Text);
}

Vue côte-à-côte (SideBySide)

using DiffPlex;
using DiffPlex.DiffBuilder;
using DiffPlex.DiffBuilder.Model;

var differ = new SideBySideDiffBuilder(new Differ());
SideBySideDiffModel model = differ.BuildDiffModel(oldText, newText);

// model.OldText.Lines / model.NewText.Lines contiennent les lignes alignées
// Chaque ligne a un ChangeType (Unchanged, Inserted, Deleted, Imaginary, Modified)

Rendu unifié (Unidiff)

using DiffPlex;
using DiffPlex.DiffBuilder;
using DiffPlex.DiffBuilder.Model;
using DiffPlex.Chunkers;
using DiffPlex.Unidiff;

string text1 = oldText;
string text2 = newText;

// simple
string uni = UnidiffRenderer.GenerateUnidiff(text1, text2, "before.txt", "after.txt");

// avec options (contexte, ignore case/espace, chunker)
var renderer = new UnidiffRenderer(contextLines: 3);
string uni2 = renderer.Generate(text1, text2, "before.txt", "after.txt");

Diff/Merge à trois voies

using DiffPlex;
using DiffPlex.Chunkers;

var threeWay = new ThreeWayDiffer();
var diff = threeWay.CreateDiffs(baseText, oldText, newText,
    ignoreWhiteSpace: false, ignoreCase: false, new LineChunker());

var merge = threeWay.CreateMerge(baseText, oldText, newText,
    ignoreWhiteSpace: false, ignoreCase: false, new LineChunker());

if (merge.HasConflicts)
{
    Console.WriteLine($"Conflits: {merge.ConflictBlocks.Count}");
}
else
{
    Console.WriteLine(merge.MergedText);
}

Options utiles

  • ignoreWhitespace / ignoreWhiteSpace : ignorer les espaces
  • ignoreCase : comparer sans tenir compte de la casse
  • Chunkers (LineChunker, WordChunker, CharacterChunker) : granularité
  • Models: DiffPaneModel (inline), SideBySideDiffModel (côte‑à‑côte)
Écrit le 2025-09-09