Belge Karşılaştırması

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

  • DiffOperation değiştirilemez ve IEquatable<DiffOperation> uygular — iki düzenlemeyi referans eşitliği yerine karşılaştırmak için Equals kullanın.
  • Önce FindCommonStartParts ile ortak öneki bulun, ardından uzunluğunu FindCommonEndParts‘nin startIndex aşı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.
  • AssemblySourceText ve AssemblyDestinationText kullanarak bir DiffOperation değ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.Equal koşularını işlem yapmıyormuş gibi (no-op) değerlendirin ve yalnızca Delete ve Insert koş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

SorunNedenDüzelt
AssemblySourceText / AssemblyDestinationText çıktısı orijinallerle eşleşmiyordiffs listesi eksik veya DiffOperation girişleri sırasızDizideki 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üyorOrtak son ek araması, FindCommonStartParts tarafından zaten eşleşen metnin üzerine çakışıyorFindCommonStartParts 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ürText değerleri boşluk veya harf büyüklüğüne göre farklılık gösterirKarşı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üyorHam 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 / MetodAçıklama
OperationEnum, bir düzenlemeyi Equal, Delete veya Insert olarak sınıflandırır
DiffOperationTek bir düzenleme: uygulandığı Text ile eşleşen bir Operation
DiffOperation.OperationBu düzenleme için Operation değeri
DiffOperation.TextBu düzenlemenin uygulandığı metin akışı
DiffOperation.EqualsOperation ve Text ile iki düzenlemeyi eşitlik açısından karşılaştırır
DiffOperation.ToStringBir düzenlemeyi günlükleme veya gösterim amacıyla dize olarak oluşturur
DiffUtilsMetin 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.AssemblySourceTextOrijinal metni, DiffOperation değerlerinin bir listesinden yeniden birleştirir
DiffUtils.AssemblyDestinationTextRevize edilmiş metni, DiffOperation değerlerinin bir listesinden yeniden birleştirir

Ayrıca Bakınız

 Türkçe