C#判断DataTable1 A列的集合是否为DataTable2 B列的集合的子集

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;
 }
}
  1. LINQ (Language Integrated Query): LINQ是.NET框架的一部分,它提供了一种查询各种数据源(如数组、集合、XML文档和数据库)的能力,就像查询SQL数据库一样。这里使用的是LINQ to Objects,即对内存中的对象集合进行查询。

  2. bool isSubset : 这是一个布尔变量,用于存储最终的判断结果。如果条件成立(即ds2.Tables[0]的所有materialcode都在ds0.Tables[2]中找到),则isSubsettrue;否则为false

  3. table2MaterialCodes.All(...) : All是LINQ中的一个扩展方法,适用于任何实现了IEnumerable<T>接口的类型。它接受一个谓词作为参数(在这个例子中是一个lambda表达式),并检查序列中的所有元素 是否都满足这个谓词。如果序列中的每个元素都使这个谓词返回true,那么All方法本身就返回true;如果序列中有任何一个元素使谓词返回falseAll方法就返回false

  4. 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]中的materialcodeds.Tables[2]code的一个子集。如果有任何一个materialcodeds.Tables[2]中找不到,isSubset将为false

当判断出ds2.Tables[0]中的某些materialcodeds.Tables[2]中不存在时,我们使用LINQ的Where方法配合Contains方法来筛选出那些在ds.Tables[2]中不存在的materialcode。这是通过table2MaterialCodes.Where(code => !table1MaterialCodes.Contains(code)).ToList()这行代码完成的,它会生成一个列表missingMaterialCodes,包含了所有在ds.Tables[2]中找不到的materialcode

相关推荐
李少兄几秒前
解决 Spring Boot 中 `Ambiguous mapping. Cannot map ‘xxxController‘ method` 错误
java·spring boot·后端
Jiaberrr2 分钟前
开启鸿蒙开发之旅:交互——点击事件
前端·华为·交互·harmonyos·鸿蒙
代码小鑫13 分钟前
A031-基于SpringBoot的健身房管理系统设计与实现
java·开发语言·数据库·spring boot·后端
Json____18 分钟前
学法减分交管12123模拟练习小程序源码前端和后端和搭建教程
前端·后端·学习·小程序·uni-app·学法减分·驾考题库
上趣工作室30 分钟前
vue2在el-dialog打开的时候使该el-dialog中的某个输入框获得焦点方法总结
前端·javascript·vue.js
家里有只小肥猫31 分钟前
el-tree 父节点隐藏
前端·javascript·vue.js
fkalis32 分钟前
【海外SRC漏洞挖掘】谷歌语法发现XSS+Waf Bypass
前端·xss
monkey_meng38 分钟前
【Rust类型驱动开发 Type Driven Development】
开发语言·后端·rust
落落落sss1 小时前
MQ集群
java·服务器·开发语言·后端·elasticsearch·adb·ruby
zxg_神说要有光1 小时前
自由职业第二年,我忘记了为什么出发
前端·javascript·程序员