在 C# 開發中,常需要判斷一個集合是否為另一個集合的子集。雖然可以用迴圈逐一比對,但使用 LINQ 內建方法能讓程式碼更簡潔、可讀性更高。
Except 與 Any若要確認 smallArr 的所有元素都包含在 bigArr 中(即嚴格子集,元素數量較少),可利用差集運算:
string[] bigArr = { "a", "b", "c" };
string[] smallArr = { "a", "b" };
// 取大集合扣除小集合後的差集
var exceptArr = bigArr.Except(smallArr);
// 若差集有元素,表示 smallArr 不是 bigArr 的子集
// 反之,差集為空則代表 smallArr 所有元素皆在 bigArr 中
bool isSubset = !exceptArr.Any();
Console.WriteLine(isSubset ? "smallArr 是 bigArr 的子集" : "smallArr 不是 bigArr 的子集");
邏輯:bigArr.Except(smallArr) 回傳存在於 bigArr 但不在 smallArr 的元素。若結果為空序列(!Any()),表示 smallArr 涵蓋了 bigArr 的所有元素,故為子集。
All 與 Any若需求放寬為「smallArr 為 bigArr 的子集,或兩者完全相同」,可改用:
bool isSubsetOrEqual = smallArr.All(item => bigArr.Contains(item));
// 或寫法:
// bool isSubsetOrEqual = smallArr.All(t => bigArr.Any(b => b == t));
Console.WriteLine(isSubsetOrEqual ? "smallArr 是 bigArr 的子集或相同" : "smallArr 不是 bigArr 的子集或相同");
All 確保 smallArr 每個元素都能在 bigArr 找到對應項目,不限制兩者長度關係。
bigArr 轉為 HashSet<T>,Contains 操作可達 O(1) 複雜度。Except 內部已使用集合運算,效能亦佳。| 情境 | 推薦寫法 | 關鍵點 |
|---|---|---|
| 嚴格子集(長度較小) | !bigArr.Except(smallArr).Any() | 差集為空即為子集 |
| 子集或相等 | smallArr.All(bigArr.Contains) | 逐一確認元素存在性 |
善用 LINQ 讓集合判斷邏輯一目瞭然,減少手寫迴圈的錯誤機率。