cs
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
。