假设我有2个DataTables,DSALL和DSSome用于存储学生信息
DSALL (存储所有学生信息)
SID(PK)
名称
地址
电话
......
DSSome (仅为某些特定学生存储SID)
SID(唯一)
现在我想要一个C#函数来检查DSALL中是否存在DSSome中的所有SID。如果DSALL中存在所有SID,则该函数返回true,否则返回false。
传统方式是
protected bool checkSID(DataTable DSALL, DataTable DSSome){
for (int i=0; i<DSSome.Rows.Count; i++){
bool isFound = false;
string SID = DSSome.Rows[i]["SID"].ToString();
for (int j=0; j<DSALL.Rows.Count; j++){
string _SID = DSALL.Rows[j]["SID"].ToString();
if (SID == _SID) { isFound = true; break; }
}
if (!isFound) return false;
}
return true;
}
还有其他更简单的方法来解决这个问题的有效方法吗?
答案 0 :(得分:1)
return DSSome.Rows.OfType<DataRow>()
.All(r => DSAll.Rows.OfType<DataRow>()
.Where(x => (string)x["SID"] == (string)r["SID"]).Count() == 1)
这是使用linq查询来比较两个集合中的值。 OfType&lt;&gt;用于将Rows集合转换为Rows<DataRow>
以使用LINQ。如果所有行都符合条件,则All()将返回true。否则返回false。
答案 1 :(得分:1)
这是另一种选择。它从DSSOME中获取所有SID,除了在DSALL中发生的那些。如果DSSOME中遗留了DSALL中不存在的任何值,.Any()
将返回true
。
然后你可以忽略该值,因为如果不是 DSSOME中的任何剩余值,你想要返回true
。
return !DSSome.Rows.Cast<DataRow>().Select(x => x["SID"])
.Except(DSALL.Rows.Cast<DataRow>().Select(x => x["SID"])).Any();