Belge Karşılaştırması
Belge Karşılaştırması
Bu kılavuz, iki metin çalıştırmasını karşılaştırmayı ve aralarındaki düzenleme sırasını Aspose.PDF FOSS metin-diff motorunu .NET için kullanarak üretmeyi gösterir. Bu karşılaştırma modelinin giriş noktası DiffOperation, bir etiketle işaretlenmiş tek bir düzenleme Operation (Equal, Delete, ya da Insert), birlikte DiffUtils ortak metni bulmak ve bir diff’i kaynak ve hedef metnine yeniden birleştirmek için yardımcı sınıf. Ayrı bir optimizasyon geçişi, aşağıda açıklanan Diff Optimizasyonu, bu şekilde üretilen ham diff çıktısını render edilmeden veya uygulanmadan önce kanonikleştirir.
Fark Modeli: İşlem ve DiffOperation
Operation, bir farkta her düzenlemeyi sınıflandıran enum’dur: Equal değişmemiş bir metin akışını işaretler, Delete kaynaktan kaldırılan bir akışı işaretler ve Insert hedefe eklenen bir akışı işaretler. DiffOperation, bir Operation değerini uygulandığı Text ile eşleştirir ve iki düzenlemenin eşitliğini karşılaştırabilmesi için IEquatable<DiffOperation>‘yi uygular.
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"Ortak Metni DiffUtils ile Bulma
DiffUtils, fark motoru tarafından iki dize arasında ortak ön ek ve son eki, farklı orta bölüm farkı alınmadan önce bulmak için kullanılan statik bir yardımcı sınıftır. FindCommonStartParts ortak ön eki bulur ve FindCommonEndParts ortak son eki bulur; FindCommonEndParts‘ün bir aşırı yüklemesi bir startIndex kabul eder, böylece son ek araması zaten bulunmuş bir ön ekin ardından gelen metinle sınırlanabilir.
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);Bir Farktan Metni Yeniden Birleştirme
Bir diff DiffOperation değerlerinin bir dizisi olarak ifade edildikten sonra, DiffUtils karşılaştırmanın her iki tarafını yeniden oluşturabilir: AssemblySourceText, Equal ve Delete koşularından orijinal metni yeniden inşa eder, ve AssemblyDestinationText, Equal ve Insert koşularından revize edilmiş metni yeniden inşa eder.
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"Düzenlemeleri Karşılaştırma ve Raporlama
DiffOperation, Equals, GetHashCode ve ToString üzerine yazar, böylece düzenlemeler eşitlik açısından karşılaştırılabilir veya ek dönüşüm kodu olmadan günlükler ve test çıktısına yazılabilir.
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());İpuçları ve En İyi Uygulamalar
DiffOperationdeğiştirilemez veIEquatable<DiffOperation>uygular — iki düzenlemeyi referans eşitliği yerine karşılaştırmak içinEqualskullanın.- Önce
FindCommonStartPartsile ortak öneki bulun, ardından uzunluğunuFindCommonEndParts‘ninstartIndexaşırı yüklemesine aktarın; böylece kısa bir ortak önek, sonek kısmının bir parçası olarak iki kez sayılmaz. AssemblySourceTextveAssemblyDestinationTextkullanarak birDiffOperationdeğerleri dizisinin tam orijinal ve revize metne round-trip (geri dönüş) yapıp yapmadığını doğrulayın; başka bir yerde kullanmadan önce.- Görsel bir diff render ederken
Operation.Equalkoşularını işlem yapmıyormuş gibi (no-op) değerlendirin ve yalnızcaDeleteveInsertkoşularını vurgulayın. - Bu motor doğrudan belgeleri değil, metni karşılaştırır — karşılaştırmak istediğiniz metni (örneğin bir sayfadan veya belgeden) çıkartın, ardından farkı oluşturun.
Yaygın Sorunlar
| Sorun | Neden | Düzelt |
|---|---|---|
AssemblySourceText / AssemblyDestinationText çıktısı orijinallerle eşleşmiyor | diffs listesi eksik veya DiffOperation girişleri sırasız | Dizideki her düzenlemeyi, düzenlemelerin gerçekleştiği orijinal sırayla dahil edin |
FindCommonEndParts kısa, benzer dizeler üzerinde beklenmeyen bir sonuç döndürüyor | Ortak son ek araması, FindCommonStartParts tarafından zaten eşleşen metnin üzerine çakışıyor | FindCommonStartParts tarafından döndürülen uzunluğu startIndex argümanı olarak geçin |
Equals aynı görünen düzenlemeler için false döndürür | Text değerleri boşluk veya harf büyüklüğüne göre farklılık gösterir | Karşılaştırmak istediğiniz DiffOperation değerlerini oluşturmadan önce metni (trim / case-fold) normalleştirin |
| Diff çıktısı gürültülü ya da gereksiz yere parçalanmış görünüyor | Ham DiffOperation dizileri henüz kanonikleştirilmemiş | Sıralamayı aşağıda açıklanan optimizasyon geçişiyle çalıştır Diff Optimizasyonu |
FAQ
Diff motoru neyi karşılaştırır?
Metin akışlarını karşılaştırır ve DiffOperation değerlerinden oluşan bir dizi üretir; bu değerler bir dizeden diğerine dönüştürmek için gereken düzenlemeleri — değişmemiş, silinmiş veya eklenmiş metin — tanımlar.
Operation hangi düzenleme türlerini destekler?
Üç tanedir: Equal değişmemiş metin için, Delete kaynaktan kaldırılan metin için ve Insert hedefe eklenen metin için.
İki düzenlemenin aynı olup olmadığını nasıl kontrol ederim?
Bir DiffOperation örneğinde Equals‘ı çağırın veya Operation ve Text özelliklerini doğrudan karşılaştırın.
Bir diff’ten orijinal ve revize edilmiş metni geri alabilir miyim?
Evet — orijinal metin için DiffOperation değerlerinin listesini DiffUtils.AssemblySourceText‘e, revize edilmiş metin için ise DiffUtils.AssemblyDestinationText‘ye gönderin.
Bu sayfa bir diff’in birleştirilmesini veya temizlenmesini kapsıyor mu?
Hayır — ham bir diff’i (bitişik koşuları birleştirme, eşitlikler boyunca düzenlemeleri kaydırma) kanonikleştirmek ayrı olarak şurada ele alınır Diff Optimizasyonu.
API Reference Özeti
| Sınıf / Metod | Açıklama |
|---|---|
Operation | Enum, bir düzenlemeyi Equal, Delete veya Insert olarak sınıflandırır |
DiffOperation | Tek bir düzenleme: uygulandığı Text ile eşleşen bir Operation |
DiffOperation.Operation | Bu düzenleme için Operation değeri |
DiffOperation.Text | Bu düzenlemenin uygulandığı metin akışı |
DiffOperation.Equals | Operation ve Text ile iki düzenlemeyi eşitlik açısından karşılaştırır |
DiffOperation.ToString | Bir düzenlemeyi günlükleme veya gösterim amacıyla dize olarak oluşturur |
DiffUtils | Metin farkı araçları içeren statik yardımcı sınıf |
DiffUtils.FindCommonStartParts | İki dize tarafından paylaşılan ortak öneki bulur |
DiffUtils.FindCommonEndParts | İki dize tarafından paylaşılan ortak soneki bulur; isteğe bağlı olarak bir indeksten başlayabilir |
DiffUtils.AssemblySourceText | Orijinal metni, DiffOperation değerlerinin bir listesinden yeniden birleştirir |
DiffUtils.AssemblyDestinationText | Revize edilmiş metni, DiffOperation değerlerinin bir listesinden yeniden birleştirir |