如何在 C# 中比較字串(不使用檔案) - GroupDocs 教程
有沒有遇過需要在 .NET 應用程式中比較兩個文字字串,但又害怕傳統比較方法的複雜性?你並不孤單。無論是建立版本控制系統、驗證使用者輸入,或只是想找出兩段文字的差異,字串比較很快就會變成頭痛問題。在本指南中,你將學會如何高效比較字串,利用 GroupDocs.Comparison,讓你不必觸碰檔案系統。
快速解答
- 什麼函式庫支援直接字串比較? GroupDocs.Comparison for .NET.
- 我需要先寫入檔案嗎? 不需要 – API 直接使用字串變數。
- 支援哪些 .NET 版本? .NET Framework 4.6.1+、.NET Core 2.0+、.NET 5/6/7。
- 在正式環境需要授權嗎? 是,需要完整或暫時授權才能在正式環境使用。
- 比較速度有多快? 它在記憶體中執行,對於小至中等大小的文字,通常比基於檔案的方式快 3‑5 倍。
為什麼選擇直接字串比較?
直接字串比較消除磁碟 I/O 的開銷,讓你在典型小於 500 KB 的文字片段上 執行速度提升至 5 倍。它也減少記憶體壓力,因為不會產生暫存檔,並且在聊天或即時文件編輯等互動應用中提供即時回饋。
開始前的需求
- 開發環境 – Visual Studio 2022(或任何相容 .NET 的 IDE),已安裝 .NET Framework 4.6.1+ 或 .NET Core 2.0+。
- 基本 C# 技能 – 能夠建立主控台或 Web 專案、加入
using陳述式,並實例化物件。 - GroupDocs.Comparison NuGet 套件 – 我們將在下一節安裝它。
在專案中設定 GroupDocs.Comparison
你有兩種簡單方式將函式庫加入你的解決方案。
選項 1:NuGet 套件管理員主控台
在 Visual Studio 開啟套件管理員主控台,然後執行:
Install-Package GroupDocs.Comparison -Version 25.4.0
選項 2:.NET CLI
如果你偏好使用命令列(或使用 VS Code),執行:
dotnet add package GroupDocs.Comparison --version 25.4.0
小技巧:將版本固定為 25.4.0(或更新版本),以避免意外的重大變更。
取得授權設定
GroupDocs 提供多種授權選項,視你的需求而定:
- 免費試用 – 適合測試與小型專案。
- 暫時授權 – 適用於較大規模的評估部署。
- 完整授權 – 正式環境工作負載所需。
前往他們的 purchase page 了解這些選項。對於學習目的,免費試用已足夠。
如何在 C# 中直接比較字串
GroupDocs.Comparison 提供記憶體內的 API,讓你直接傳入兩個文字字串,即時取得詳細差異,且不需觸碰檔案系統。透過建立 Comparer 實例、加入目標字串,並呼叫 Compare,即可取得 ComparisonResult,可渲染為 HTML、純文字或 PDF,適合即時應用。
步驟 1:設定 Comparer 物件
Comparer 類別是評估兩段文字差異的核心引擎。
LoadOptions 指定輸入的解讀方式,允許直接載入原始文字。
using GroupDocs.Comparison;
using GroupDocs.Comparison.Options;
使用來源字串建立 comparer,並告訴函式庫你正在載入原始文字:
using (Comparer comparer = new Comparer("source text", new LoadOptions() { LoadText = true }))
{
// Your comparison logic goes here
}
為什麼使用 using 區塊? Comparer 實作了 IDisposable;將其包在 using 中可確保及時釋放所有非受控資源,這在迴圈中執行大量比較時尤為重要。
步驟 2:加入目標文字
Add 註冊一個新文件或字串,以與來源比較。
現在提供你想比較的文字。若需要,可加入多個目標。
Add 方法註冊一個新文件(或字串),與原始來源進行比較。
comparer.Add(targetString, new LoadOptions() { LoadText = true });
你可以重複呼叫 Add,將來源與多個版本比較。
步驟 3:執行比較
Compare 執行差異引擎,回傳包含變更資料的 ComparisonResult。
觸發差異演算法。
Compare 方法執行實際分析,產生包含所有變更中繼資料的 ComparisonResult 物件。
var result = comparer.Compare();
底層演算法在字元層面運作,使用專利的相似度引擎偵測插入、刪除與修改,兼顧速度與精確度。
步驟 4:取得結果
GetResultString() 產生一段 HTML 字串,突顯插入、刪除與修改。
最後,取得可供人類閱讀的差異。
GetResultString() 方法回傳一段 HTML 樣式的字串,新增內容以綠色標示,刪除以紅色,修改以黃色。
string diffHtml = result.GetResultString();
你可以在網頁視圖中呈現 diffHtml、在電子郵件中傳送,或記錄下來作為稽核用途。
何時應使用此方法?
當你需要即時、低開銷的記憶體內資料差異比對時,直接字串比較表現優異。它適用於 API 回應驗證、即時協同編輯、設定變更偵測、資料遷移驗證,以及聊天應用訊息差異比對。對於大型文件(> 10 MB)或必須保留複雜版面時,基於檔案的比較可能較為適合。
常見陷阱與避免方法
忘記傳入 LoadOptions 參數
問題:即使已傳入字串,仍收到 “file not found” 例外。
解決方法:在建立 Comparer 或呼叫 Add 時,務必加入 new LoadOptions() { LoadText = true }。
// Wrong - will look for files named "source text"
using (Comparer comparer = new Comparer("source text"))
// Right - tells GroupDocs this is raw text
using (Comparer comparer = new Comparer("source text", new LoadOptions() { LoadText = true }))
大規模比較導致記憶體洩漏
問題:批次處理期間記憶體使用量持續上升。
解決方案:將每個 Comparer 包在 using 陳述式中,並及時釋放。
// This ensures proper cleanup
using (Comparer comparer = new Comparer(sourceText, new LoadOptions() { LoadText = true }))
{
comparer.Add(targetText, new LoadOptions() { LoadText = true });
comparer.Compare();
string result = comparer.GetResultString();
// comparer is automatically disposed here
}
處理 Null 或空字串
問題:Null 輸入會拋出 ArgumentNullException。
預防措施:在呼叫函式庫前先驗證輸入。
if (string.IsNullOrEmpty(sourceText) || string.IsNullOrEmpty(targetText))
{
// Handle the edge case appropriately for your application
return "Cannot compare null or empty strings";
}
效能技巧與最佳實踐
大量應用的記憶體管理
如果每分鐘比較數千個字串,考慮重複使用單一 Comparer 實例,於每次執行間呼叫 Reset(),或將多個比較合併為一次呼叫,以減少物件產生。
非同步處理
對於 Web API,將比較工作移至背景任務,以保持請求執行緒的回應性。
public async Task<string> CompareStringsAsync(string source, string target)
{
return await Task.Run(() =>
{
using (Comparer comparer = new Comparer(source, new LoadOptions() { LoadText = true }))
{
comparer.Add(target, new LoadOptions() { LoadText = true });
comparer.Compare();
return comparer.GetResultString();
}
});
}
何時選擇檔案比較 vs. 直接字串比較
| 情境 | 推薦做法 |
|---|---|
| 文字已在記憶體中,< 500 KB | 直接字串比較(記憶體內) |
| 文件 > 10 MB 或需要完整版面保留 | 基於檔案的比較 |
| 需要保留原始格式(字型、圖片) | 基於檔案的比較 |
| 即時回饋(例如聊天、即時編輯) | 直接字串比較 |
與常見 .NET 框架整合
ASP.NET Core Web API 整合
公開一個接受兩個 JSON 字串並回傳差異的 REST 端點。
[ApiController]
[Route("api/[controller]")]
public class ComparisonController : ControllerBase
{
[HttpPost("compare")]
public IActionResult CompareTexts([FromBody] ComparisonRequest request)
{
try
{
using (Comparer comparer = new Comparer(request.SourceText, new LoadOptions() { LoadText = true }))
{
comparer.Add(request.TargetText, new LoadOptions() { LoadText = true });
comparer.Compare();
var result = new ComparisonResponse
{
Result = comparer.GetResultString(),
Status = "Success"
};
return Ok(result);
}
}
catch (Exception ex)
{
return BadRequest($"Comparison failed: {ex.Message}");
}
}
}
單元測試整合
在測試套件中使用此函式庫,斷言轉換產生預期的輸出。
[Test]
public void Should_DetectDifferencesInStrings()
{
// Arrange
string expected = "Hello World";
string actual = "Hello Universe";
// Act
string comparisonResult;
using (Comparer comparer = new Comparer(expected, new LoadOptions() { LoadText = true }))
{
comparer.Add(actual, new LoadOptions() { LoadText = true });
comparer.Compare();
comparisonResult = comparer.GetResultString();
}
// Assert
Assert.That(comparisonResult, Does.Contain("World"));
Assert.That(comparisonResult, Does.Contain("Universe"));
}
疑難排解常見問題
“File Not Found” 錯誤
原因 – 缺少 LoadOptions 或 LoadText = false。
解決方案 – 確認建構子與 Add 呼叫皆包含 new LoadOptions() { LoadText = true }。
大字串效能不佳
原因 – 輸入過大(> 1 MB)或在 UI 執行緒上執行。
解決方案 – 對於巨量負載改用基於檔案的比較,分析記憶體使用,並將工作移至背景執行緒。
結果或格式異常
原因 – 編碼不匹配、隱藏字元(Tab、CR/LF)。
解決方案 – 在比較前正規化字串(string.Normalize(NormalizationForm.FormC))並去除不可見的空白。
結語
現在你已擁有完整、可投入正式環境的 C# 直接字串比較範例,使用 GroupDocs.Comparison。請記得:
- 始終將
LoadOptions.LoadText = true設定為 true。 - 及時釋放
Comparer物件。 - 當資料已在變數中時,選擇記憶體內方式以提升速度。
- 對於非常大型或對版面敏感的文件,改用基於檔案的比較。
- 驗證輸入以防止 Null 或空字串。
只需幾行程式碼,即可在任何 .NET 應用程式中提供強大的差異功能——從後端服務到互動式 Web 應用。
常見問答
Q: 我可以有效率地比較長度差異極大的字串嗎?
A: 可以,演算法呈線性擴展,對數兆位元組以下的字串仍保持快速;對於 > 10 MB,建議使用基於檔案的比較以獲得最佳效能。
Q: 若比較 Null 或空字串會發生什麼?
A: 函式庫會回傳空的差異,但最佳做法是事先檢查 string.IsNullOrEmpty,以提供清晰的使用者訊息。
Q: 這個方法對於同時多執行緒比較是否安全?
A: 每個 Comparer 實例僅支援單執行緒;請為每個執行緒建立獨立實例,或使用執行緒本地池以應付高併發。
Q: 與 string.Equals() 相比,效能如何?
A: string.Equals() 只告訴你文字是否完全相同。GroupDocs.Comparison 會額外偵測差異,僅產生適度的開銷——對於 100 KB 的字串通常需 3‑5 ms,而純相等檢查則 < 1 ms。
Q: 我可以自訂差異輸出格式嗎?
A: 可以,ComparisonOptions 允許你變更 HTML 標記、CSS 類別,甚至匯出為純文字或 PDF。
Q: 比較的字串有大小限制嗎?
A: 沒有硬性限制,但在約 5 MB 以上效能會下降;對於非常大的文件,建議如前所述改用基於檔案的比較。
其他資源
最後更新: 2026-06-10
測試環境: GroupDocs.Comparison 25.4.0 for .NET
作者: GroupDocs
comparer.Add("target text", new LoadOptions() { LoadText = true });
comparer.Compare();
string resultString = comparer.GetResultString();
Console.WriteLine("Comparison Result:\n" + resultString);