Perbandingan Dokumen
Perbandingan Dokumen
Panduan ini menunjukkan cara membandingkan dua rangkaian teks dan menghasilkan urutan edit di antara keduanya menggunakan mesin text-diff FOSS Aspose.PDF untuk .NET. Titik masuk untuk model perbandingan ini adalah DiffOperation, sebuah edit tunggal yang ditandai dengan sebuah Operation (Equal, Delete, atau Insert), bersama dengan DiffUtils kelas pembantu untuk menemukan teks umum dan menyusun kembali diff menjadi teks sumber dan tujuan. Sebuah proses optimalisasi terpisah, yang dijelaskan dalam Optimasi Diff, mengkanoinisasi output diff mentah yang dihasilkan dengan cara ini sebelum ditampilkan atau diterapkan.
Model Diff: Operasi dan DiffOperation
Operation adalah enum yang mengklasifikasikan setiap edit dalam diff: Equal menandai rangkaian teks yang tidak berubah, Delete menandai rangkaian yang dihapus dari sumber, dan Insert menandai rangkaian yang ditambahkan di tujuan. DiffOperation menggabungkan nilai Operation dengan Text yang diterapkannya, dan mengimplementasikan IEquatable<DiffOperation> sehingga dua edit dapat dibandingkan untuk kesetaraan.
using Aspose.Pdf.Comparison.Diff;
// A single edit consists of an Operation and the run of text it applies to.
var unchanged = new DiffOperation(Operation.Equal, "Aspose.PDF ");
var removed = new DiffOperation(Operation.Delete, "for .NET Framework");
var added = new DiffOperation(Operation.Insert, "FOSS for .NET");
Console.WriteLine(unchanged.Operation); // Equal
Console.WriteLine(added.Text); // "FOSS for .NET"Menemukan Teks Umum dengan DiffUtils
DiffUtils adalah kelas pembantu statis yang digunakan oleh mesin diff untuk menemukan awalan dan akhiran umum yang dibagi oleh dua string sebelum bagian tengah yang berbeda di-diff. FindCommonStartParts menemukan awalan umum, dan FindCommonEndParts menemukan akhiran umum; sebuah overload dari FindCommonEndParts menerima startIndex sehingga pencarian akhiran dapat dibatasi pada teks yang mengikuti awalan yang sudah ditemukan.
string original = "The quick brown fox";
string revised = "The quick red fox jumps";
var commonStart = DiffUtils.FindCommonStartParts(original, revised);
var commonEnd = DiffUtils.FindCommonEndParts(original, revised);Menyusun Kembali Teks dari Diff
Setelah diff diungkapkan sebagai urutan nilai DiffOperation, DiffUtils dapat merekonstruksi salah satu sisi perbandingan: AssemblySourceText membangun kembali teks asli dari Equal dan Delete runs, dan AssemblyDestinationText membangun kembali teks revisi dari Equal dan Insert runs.
using System.Collections.Generic;
var diffs = new List<DiffOperation>
{
new DiffOperation(Operation.Equal, "The quick "),
new DiffOperation(Operation.Delete, "brown"),
new DiffOperation(Operation.Insert, "red"),
new DiffOperation(Operation.Equal, " fox")
};
string sourceText = DiffUtils.AssemblySourceText(diffs);
string destinationText = DiffUtils.AssemblyDestinationText(diffs);
Console.WriteLine(sourceText); // "The quick brown fox"
Console.WriteLine(destinationText); // "The quick red fox"Membandingkan dan Melaporkan Edit
DiffOperation menimpa Equals, GetHashCode, dan ToString, sehingga edit dapat dibandingkan untuk kesetaraan atau dituliskan ke log dan output tes tanpa kode konversi tambahan.
var a = new DiffOperation(Operation.Equal, "PDF");
var b = new DiffOperation(Operation.Equal, "PDF");
bool same = a.Equals(b); // true - same Operation and Text
Console.WriteLine(a.ToString());Tips dan Praktik Terbaik
DiffOperationbersifat immutable dan mengimplementasikanIEquatable<DiffOperation>— gunakanEqualsuntuk membandingkan dua edit daripada kesetaraan referensi.- Temukan prefiks bersama dengan
FindCommonStartPartsterlebih dahulu, kemudian berikan panjangnya ke overloadstartIndexdariFindCommonEndPartsuntuk menghindari prefiks bersama yang pendek dihitung ganda sebagai bagian dari sufiks. - Gunakan
AssemblySourceTextdanAssemblyDestinationTextuntuk memverifikasi bahwa urutan nilaiDiffOperationmelakukan round-trip ke teks asli dan revisi yang tepat sebelum Anda mengandalkannya di tempat lain. - Anggap run
Operation.Equalsebagai no-op saat merender diff visual, dan hanya sorot runDeletedanInsertruns. - Mesin ini membandingkan perbedaan teks, bukan dokumen secara langsung — ekstrak teks yang ingin Anda bandingkan (misalnya, dari halaman atau dokumen) sebelum membuat diff.
Masalah Umum
| Masalah | Penyebab | Perbaiki |
|---|---|---|
AssemblySourceText / AssemblyDestinationText output tidak cocok dengan aslinya | Daftar diffs tidak lengkap atau entri DiffOperation tidak berurutan | Sertakan setiap penyuntingan dalam urutan, sesuai urutan asli saat penyuntingan terjadi |
FindCommonEndParts mengembalikan hasil yang tidak terduga pada string pendek yang mirip | Pencarian akhiran umum tumpang tindih dengan teks yang sudah dicocokkan oleh FindCommonStartParts | Berikan panjang yang dikembalikan oleh FindCommonStartParts sebagai argumen startIndex |
Equals mengembalikan false untuk edit yang tampak identik | Nilai Text berbeda karena spasi atau huruf besar/kecil | Normalisasi teks (potong / ubah huruf) sebelum membuat nilai DiffOperation yang ingin Anda bandingkan |
| Output diff terlihat berisik atau terfragmentasi secara tidak perlu | Urutan DiffOperation mentah belum dikanonisasi | Jalankan urutan tersebut melalui tahap optimisasi yang dijelaskan dalam Optimisasi Diff |
FAQ
Apa yang dibandingkan oleh engine Diff?
Ia membandingkan rangkaian teks dan menghasilkan urutan nilai DiffOperation yang menggambarkan edit — teks yang tidak berubah, dihapus, atau disisipkan — yang diperlukan untuk mengubah satu string menjadi yang lain.
Jenis edit apa yang didukung oleh Operation?
Tiga: Equal untuk teks yang tidak berubah, Delete untuk teks yang dihapus dari sumber, dan Insert untuk teks yang ditambahkan di tujuan.
Bagaimana cara memeriksa apakah dua edit sama?
Panggil Equals pada sebuah instance DiffOperation, atau bandingkan properti Operation dan Text secara langsung.
Apakah saya dapat memperoleh teks asli dan yang direvisi dari sebuah diff?
Ya — berikan daftar nilai DiffOperation ke DiffUtils.AssemblySourceText untuk teks asli dan DiffUtils.AssemblyDestinationText untuk teks yang direvisi.
Apakah halaman ini mencakup penggabungan atau pembersihan diff?
Tidak — mengkanonisasi diff mentah (menggabungkan run yang bersebelahan, menggeser edit melintasi kesetaraan) dibahas secara terpisah dalam Optimisasi Diff.
API Reference Ringkasan
| Kelas / Metode | Deskripsi |
|---|---|
Operation | Enum yang mengklasifikasikan edit sebagai Equal, Delete, atau Insert |
DiffOperation | Satu suntingan: sebuah Operation yang dipasangkan dengan Text yang diterapkannya |
DiffOperation.Operation | Nilai Operation untuk suntingan ini |
DiffOperation.Text | Rentang teks yang diterapkan oleh suntingan ini |
DiffOperation.Equals | Membandingkan dua suntingan untuk kesetaraan berdasarkan Operation dan Text |
DiffOperation.ToString | Menyajikan edit sebagai string untuk logging atau tampilan |
DiffUtils | Kelas pembantu statis dengan utilitas pembandingan teks |
DiffUtils.FindCommonStartParts | Menemukan prefiks umum yang dibagikan oleh dua string |
DiffUtils.FindCommonEndParts | Menemukan sufiks umum yang dibagikan oleh dua string, secara opsional mulai dari sebuah indeks |
DiffUtils.AssemblySourceText | Menyusun kembali teks asli dari daftar nilai DiffOperation |
DiffUtils.AssemblyDestinationText | Menyusun kembali teks yang direvisi dari daftar nilai DiffOperation |