การเปรียบเทียบเอกสาร
การเปรียบเทียบเอกสาร
คู่มือนี้แสดงวิธีการเปรียบเทียบข้อความสองชุดและสร้างลำดับของการแก้ไขระหว่างพวกมันโดยใช้ Aspose.PDF FOSS text-diff engine สำหรับ .NET. จุดเริ่มต้นสำหรับโมเดลการเปรียบเทียบนี้คือ DiffOperation, การแก้ไขเดียวที่มีแท็กด้วย Operation (Equal, Delete, หรือ Insert), พร้อมกับ DiffUtils คลาสช่วยเหลือสำหรับการหาข้อความที่เหมือนกันและการประกอบ diff กลับเป็นข้อความต้นฉบับและข้อความปลายทางอีกครั้ง. ขั้นตอนการเพิ่มประสิทธิภาพแยกต่างหาก, ที่อธิบายใน การเพิ่มประสิทธิภาพ Diff, ทำให้ผลลัพธ์ diff ดิบที่สร้างขึ้นในลักษณะนี้เป็นมาตรฐานก่อนที่จะแสดงหรือใช้งาน.
โมเดล Diff: การทำงานและ DiffOperation
Operation คือ enum ที่จัดประเภทการแก้ไขแต่ละรายการใน diff: Equal ระบุช่วงข้อความที่ไม่เปลี่ยนแปลง, Delete ระบุช่วงที่ถูกลบจากต้นฉบับ, และ Insert ระบุช่วงที่เพิ่มในปลายทาง. DiffOperation จับคู่ค่าของ Operation กับ Text ที่มันใช้, และทำการ implement IEquatable<DiffOperation> เพื่อให้การเปรียบเทียบความเท่าเทียมของการแก้ไขสองรายการเป็นไปได้.
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"การค้นหาข้อความร่วมด้วย DiffUtils
DiffUtils คือคลาสช่วยเหลือแบบ static ที่ใช้โดยเครื่องมือ diff เพื่อค้นหาคำนำหน้าและส่วนต่อท้ายที่ร่วมกันของสองสตริงก่อนที่ส่วนกลางที่แตกต่างจะถูกทำ diff. FindCommonStartParts ค้นหาคำนำหน้าที่ร่วม, และ FindCommonEndParts ค้นหาส่วนต่อท้ายที่ร่วม; การ overload ของ FindCommonEndParts รับค่า startIndex เพื่อให้การค้นหาส่วนต่อท้ายจำกัดอยู่ในข้อความที่ตามมาหลังคำนำหน้าที่ได้ค้นหาแล้ว.
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);การประกอบข้อความจาก Diff
เมื่อ diff ถูกแสดงเป็นลำดับของค่า DiffOperation, DiffUtils สามารถสร้างด้านใดด้านหนึ่งของการเปรียบเทียบได้: AssemblySourceText สร้างข้อความต้นฉบับจากการทำงานของ Equal และ Delete, และ AssemblyDestinationText สร้างข้อความที่แก้ไขใหม่จากการทำงานของ Equal และ Insert.
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"การเปรียบเทียบและการรายงานการแก้ไข
DiffOperation แทนที่ Equals, GetHashCode และ ToString, ดังนั้นการแก้ไขจึงสามารถเปรียบเทียบความเท่าเทียมกันหรือเขียนลงบันทึกและผลลัพธ์การทดสอบได้โดยไม่ต้องมีโค้ดการแปลงเพิ่มเติม.
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());เคล็ดลับและแนวทางปฏิบัติที่ดีที่สุด
DiffOperationเป็น immutable และ implementsIEquatable<DiffOperation>— ใช้Equalsเพื่อเปรียบเทียบการแก้ไขสองรายการแทนการเปรียบเทียบอ้างอิง.- ค้นหาพรีฟิกซ์ที่เหมือนกันด้วย
FindCommonStartPartsก่อน, จากนั้นส่งความยาวของมันเข้าไปใน overloadstartIndexของFindCommonEndPartsเพื่อหลีกเลี่ยงการนับพรีฟิกซ์ที่สั้นซ้ำสองครั้งเป็นส่วนหนึ่งของซัฟฟิกซ์. - ใช้
AssemblySourceTextและAssemblyDestinationTextเพื่อตรวจสอบว่าลำดับของค่าDiffOperationสามารถ round-trips ไปยังข้อความต้นฉบับและข้อความที่แก้ไขใหม่ได้อย่างตรงกันก่อนที่คุณจะพึ่งพาในที่อื่น. - ถือการทำงานของ
Operation.Equalเป็น no-op เมื่อแสดง diff แบบภาพ, และไฮไลต์เฉพาะการทำงานของDeleteและInsertเท่านั้น. - เครื่องมือนี้ทำการเปรียบเทียบความแตกต่างของข้อความ ไม่ใช่เอกสารโดยตรง — ให้ดึงข้อความที่คุณต้องการเปรียบเทียบ (เช่น จากหน้าเว็บหรือเอกสาร) ก่อนที่จะสร้างการเปรียบเทียบความแตกต่าง.
ปัญหาทั่วไป
| ปัญหา | สาเหตุ | แก้ไข |
|---|---|---|
ผลลัพธ์ของ AssemblySourceText / AssemblyDestinationText ไม่ตรงกับต้นฉบับ | รายการ diffs ไม่ครบหรือรายการ DiffOperation ของมันเรียงลำดับผิด | รวมการแก้ไขทุกขั้นตอนในลำดับตามลำดับเดิมที่เกิดขึ้น |
FindCommonEndParts คืนค่าที่ไม่คาดคิดเมื่อใช้งานกับสตริงสั้นที่คล้ายกัน | การค้นหาส่วนต่อท้ายที่เหมือนกันทับซ้อนกับข้อความที่ FindCommonStartParts จับคู่แล้ว | ส่งความยาวที่ FindCommonStartParts คืนค่าเป็นอาร์กิวเมนต์ startIndex |
Equals คืนค่า false สำหรับการแก้ไขที่ดูเหมือนเหมือนกัน | ค่าของ Text แตกต่างกันด้วยช่องว่างหรือการใช้ตัวพิมพ์ใหญ่/เล็ก | ทำให้ข้อความเป็นมาตรฐาน (ตัดช่องว่าง / แปลงเป็นตัวพิมพ์เดียว) ก่อนสร้างค่าของ DiffOperation ที่คุณต้องการเปรียบเทียบ |
| ผลลัพธ์การเปรียบเทียบดูรกหรือแยกส่วนโดยไม่จำเป็น | ลำดับ DiffOperation ดิบยังไม่ได้ทำให้เป็นมาตรฐาน | รันลำดับผ่านขั้นตอนการเพิ่มประสิทธิภาพที่อธิบายไว้ใน การเพิ่มประสิทธิภาพ Diff |
FAQ
เครื่องมือ Diff เปรียบเทียบอะไร?
มันเปรียบเทียบชุดของข้อความและสร้างลำดับของค่า DiffOperation ที่อธิบายการแก้ไข — ข้อความที่ไม่เปลี่ยนแปลง, ถูกลบ, หรือถูกแทรก — ที่จำเป็นเพื่อเปลี่ยนสตริงหนึ่งให้เป็นอีกสตริงหนึ่ง.
ประเภทการแก้ไขใดที่ Operation รองรับ?
สามประเภท: Equal สำหรับข้อความที่ไม่เปลี่ยนแปลง, Delete สำหรับข้อความที่ถูกลบจากแหล่งที่มา, และ Insert สำหรับข้อความที่เพิ่มในปลายทาง.
ฉันจะตรวจสอบว่าการแก้ไขสองรายการเหมือนกันหรือไม่อย่างไร?
เรียก Equals บนอินสแตนซ์ของ DiffOperation, หรือเปรียบเทียบคุณสมบัติ Operation และ Text ของมันโดยตรง.
ฉันสามารถดึงข้อความต้นฉบับและข้อความที่แก้ไขจาก diff ได้หรือไม่?
ใช่ — ส่งรายการค่า DiffOperation ไปยัง DiffUtils.AssemblySourceText สำหรับข้อความต้นฉบับและ DiffUtils.AssemblyDestinationText สำหรับข้อความที่แก้ไข.
หน้านี้ครอบคลุมการผสานหรือทำความสะอาด diff หรือไม่?
No — การทำให้ diff ดิบเป็นมาตรฐาน (การรวมรันที่อยู่ติดกัน, การเลื่อนการแก้ไขผ่านส่วนที่เท่ากัน) จะอธิบายแยกต่างหากใน การเพิ่มประสิทธิภาพ Diff.
API Reference สรุป
| คลาส / เมธอด | คำอธิบาย |
|---|---|
Operation | Enum ที่จำแนกการแก้ไขเป็น Equal, Delete หรือ Insert |
DiffOperation | การแก้ไขเดี่ยว: Operation ที่จับคู่กับ Text ที่มันนำไปใช้ |
DiffOperation.Operation | ค่า Operation สำหรับการแก้ไขนี้ |
DiffOperation.Text | ส่วนของข้อความที่การแก้ไขนี้ใช้กับ |
DiffOperation.Equals | เปรียบเทียบการแก้ไขสองรายการเพื่อความเท่ากันโดย Operation และ Text |
DiffOperation.ToString | แสดงการแก้ไขเป็นสตริงเพื่อบันทึกหรือแสดงผล |
DiffUtils | คลาสช่วยเหลือแบบสแตติกที่มียูทิลิตี้สำหรับการเปรียบเทียบข้อความ |
DiffUtils.FindCommonStartParts | ค้นหาคำนำหน้าที่เหมือนกันระหว่างสองสตริง |
DiffUtils.FindCommonEndParts | ค้นหาคำต่อท้ายที่เหมือนกันระหว่างสองสตริง โดยสามารถเริ่มจากดัชนีที่กำหนดได้ |
DiffUtils.AssemblySourceText | ประกอบข้อความต้นฉบับใหม่จากรายการของค่า DiffOperation |
DiffUtils.AssemblyDestinationText | ประกอบข้อความที่แก้ไขใหม่จากรายการของค่า DiffOperation |