השוואת מסמכים
השוואת מסמכים
מדריך זה מציג כיצד להשוות בין שני רצפים של טקסט וליצור את סדרת העריכות ביניהם באמצעות מנוע ה-text-diff הקוד הפתוח Aspose.PDF עבור .NET. נקודת הכניסה למודל ההשוואה הזה היא DiffOperation, עריכה בודדת המתויגת ב- Operation (Equal, Delete, או Insert), יחד עם ה- DiffUtils מחלקת עזר לאיתור טקסט משותף והרכבת diff מחדש חזרה לטקסט המקור והיעד. מעבר אופטימיזציה נפרד, המתואר ב- אופטימיזציית diff, ממיר לפורמט קנוני פלט diff גולמי שנוצר בדרך זו לפני שהוא מוצג או מיושם.
מודל ה-Diff: פעולה ו-DiffOperation
Operation הוא ה-enum שמסווג כל עריכה ב-diff: Equal מסמן רצף טקסט שלא השתנה, Delete מסמן רצף שהוסר מהמקור, ו-Insert מסמן רצף שהתווסף ביעד. DiffOperation משזז ערך Operation עם ה-Text אליו הוא מוחל, ומממש 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 היא מחלקת עזר סטטית המשמשת את מנוע ה-diff למציאת הקידומת והסיומת המשותפות לשתי מחרוזות לפני שמקטע האמצע השונה מבוצע diff. FindCommonStartParts מאתרת את הקידומת המשותפת, ו-FindCommonEndParts מאתרת את הסיומת המשותפת; גרסה מותאמת של 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הוא בלתי ניתן לשינוי ומיישם אתIEquatable<DiffOperation>— השתמש ב-Equalsכדי להשוות שני עריכות במקום השוואת זהות בהתייחסות.- אתר את הקידומת המשותפת עם
FindCommonStartPartsתחילה, ואז העבר את אורכה ל-overload שלstartIndexב-FindCommonEndPartsכדי למנוע קידומת משותפת קצרה שתיספר פעמיים כחלק מהסיומת. - השתמש ב-
AssemblySourceTextו-AssemblyDestinationTextכדי לאמת שרצף של ערכיDiffOperationמשחזר את הטקסט המקורי והמתוקן בדיוק לפני שאתה סומך עליו במקומות אחרים. - התייחס להרצות
Operation.Equalכלא-פעולות בעת רינדור diff חזותי, והדגש רק את הרצותDeleteו-Insert. - המנוע הזה משווה טקסט, ולא מסמכים ישירות — יש לחלץ את הטקסט שברצונך להשוות (למשל, מדף או מסמך) לפני יצירת ההשוואה.
בעיות נפוצות
| בעיה | סיבה | תיקון |
|---|---|---|
הפלט של AssemblySourceText / AssemblyDestinationText אינו תואם למקורות | רשימת diffs אינה שלמה או שהערכים DiffOperation שלה אינם בסדר | כלול כל עריכה ברצף, בסדר המקורי שבו התרחשו העריכות |
FindCommonEndParts מחזיר תוצאה בלתי צפויה על מחרוזות קצרות ודומות | חיפוש הסיומת המשותפת חופף טקסט שכבר תואם על ידי FindCommonStartParts | העבר את האורך שמוחזר על ידי FindCommonStartParts כארגומנט startIndex |
Equals מחזיר false עבור עריכות שנראות זהות | הערכים של Text שונים ברווחים או ברישיות | נרמל את הטקסט (חיתוך / המרת רישיות) לפני בניית ערכי DiffOperation שאתה מתכוון להשוות |
| פלט Diff נראה רועש או מפוצל באופן מיותר | רצפי DiffOperation גולמיים עדיין לא קנוניקליים | הפעל את הרצף דרך מסע האופטימיזציה המתואר ב אופטימיזציית Diff |
FAQ
מה משווה מנוע ה-Diff?
הוא משווה רצפי טקסט ומייצר סדרה של ערכי DiffOperation המתארים את העריכות — טקסט שלא השתנה, נמחק, או נוסף — הדרושים כדי להפוך מחרוזת אחת לאחרת.
אילו סוגי עריכה Operation תומך?
שלושה: Equal לטקסט שלא השתנה, Delete לטקסט שהוסר מהמקור, ו-Insert לטקסט שנוסף ביעד.
איך אני בודק האם שתי עריכות זהות?
הפעל את Equals על מופע של DiffOperation, או השווה ישירות את המאפיינים Operation ו-Text שלו.
האם אני יכול לקבל בחזרה את הטקסט המקורי והמעודכן מה-diff?
כן — העבר את רשימת ערכי DiffOperation ל-DiffUtils.AssemblySourceText עבור הטקסט המקורי ו-DiffUtils.AssemblyDestinationText עבור הטקסט המעודכן.
האם דף זה מכסה מיזוג או ניקוי של diff?
לא — קנוניקליזציה של diff גולמי (מיזוג ריצות סמוכות, החלקת עריכות על פני שוויונות) מכוסה בנפרד ב אופטימיזציית Diff.
API Reference סיכום
| מחלקה / מתודה | תיאור |
|---|---|
Operation | Enum שמסווג עריכה כ-Equal, Delete או Insert |
DiffOperation | עריכה בודדת: Operation שמזוהה עם ה-Text אליו היא חלה |
DiffOperation.Operation | הערך של Operation עבור עריכה זו |
DiffOperation.Text | הקטע של הטקסט שאליו חלה עריכה זו |
DiffOperation.Equals | משווה שני עריכות לשוויון על פי Operation ו-Text |
DiffOperation.ToString | מציג עריכה כמחרוזת לצורכי רישום או הצגה |
DiffUtils | מחלקת עזר סטטית עם כלי diff של טקסט |
DiffUtils.FindCommonStartParts | מאתרת את הקידומת המשותפת לשתי מחרוזות |
DiffUtils.FindCommonEndParts | מאתרת את הסיומת המשותפת לשתי מחרוזות, עם אפשרות להתחיל מאינדקס |
DiffUtils.AssemblySourceText | מרכיב מחדש את הטקסט המקורי מרשימה של ערכי DiffOperation |
DiffUtils.AssemblyDestinationText | מרכיב מחדש את הטקסט המתוקן מרשימה של ערכי DiffOperation |