DataSet ds2 = (DataSet)res2.Anything;
// 檢查 集合B是否為集合A的子集
var table1MaterialCodes = ds.Tables[2].AsEnumerable().Select(row => row["Code"]).ToList(); //DataSet1 表Code列集合A
var table2MaterialCodes = ds2.Tables[0].AsEnumerable().Select(row => row["MaterialCode"]).ToList(); //DataSet2 表MaterialCode列集合B
bool isSubset = table2MaterialCodes.All(code => table1MaterialCodes.Contains(code)); //判斷集合B是否為集合A的子集if (!isSubset)
{
var missingMaterialCodes = table2MaterialCodes.Where(code => !table1MaterialCodes.Contains(code)).ToList();
StringBuilder msg = new StringBuilder();
foreach (var code in missingMaterialCodes)
{// msg.Append(",");msg.Append(code);msg.Append("。");
}msg.Append("顯示集合B不在集合A的數據");ShowMessage(msg.ToString(), false);return;}
}
LINQ (
Language Integrated Query
): LINQ是.NET框架的一部分,它提供了一種查詢各種數據源(如數組、集合、XML文檔和數據庫)的能力,就像查詢SQL數據庫一樣。這里使用的是LINQ to Objects,即對內存中的對象集合進行查詢。
bool isSubset
: 這是一個布爾變量,用于存儲最終的判斷結果。如果條件成立(即ds2.Tables[0]
的所有materialcode
都在ds0.Tables[2]
中找到),則isSubset
為true
;否則為false
。
table2MaterialCodes.All(...)
:All
是LINQ中的一個擴展方法,適用于任何實現了IEnumerable<T>
接口的類型。它接受一個謂詞作為參數(在這個例子中是一個lambda表達式),并檢查序列中的所有元素是否都滿足這個謂詞。如果序列中的每個元素都使這個謂詞返回true
,那么All
方法本身就返回true
;如果序列中有任何一個元素使謂詞返回false
,All
方法就返回false
。
code => table1MaterialCodes.Contains(code)
: 這是傳遞給All
方法的謂詞,一個lambda表達式。對于table2MaterialCodes
列表中的每一個materialcode
值,這個表達式都會被求值。code
是lambda表達式的參數,代表table2MaterialCodes
列表中的當前元素。table1MaterialCodes.Contains(code)
是lambda表達式的主體,它檢查table1MaterialCodes
列表是否包含code
。如果包含,表達式返回true
;否則返回false
。綜上所述,這行代碼
bool isSubset = table2MaterialCodes.All(code => table1MaterialCodes.Contains(code));
的作用是:遍歷ds2.Tables[0]
中的每個materialcode
,檢查它是否在ds.Tables[0]
的code
列表中。如果所有的materialcode
都能在ds.Tables[2]
中找到,那么isSubset
將為true
,表示ds2.Tables[0]
中的materialcode
是ds.Tables[2]
中code
的一個子集。如果有任何一個materialcode
在ds.Tables[2]
中找不到,isSubset
將為false
當判斷出ds2.Tables[0]
中的某些materialcode
在ds.Tables[2]
中不存在時,我們使用LINQ的Where
方法配合Contains
方法來篩選出那些在ds.Tables[2]
中不存在的materialcode
。這是通過table2MaterialCodes.Where(code => !table1MaterialCodes.Contains(code)).ToList()
這行代碼完成的,它會生成一個列表missingMaterialCodes
,包含了所有在ds.Tables[2]
中找不到的materialcode
。