如何在 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” 錯誤

原因 – 缺少 LoadOptionsLoadText = 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);

相關教學