0

假设我有 2 个数据表 DSALL 和 DSSome 用于存储学生信息

DSALL(存储所有学生信息)

SID (PK)
姓名
地址
电话
...

DSSome(仅存储某些特定学生的 SID)

SID(唯一)

现在我想要一个 C# 函数来检查 DSSome 中的所有 SID 是否都存在于 DSALL 中。如果 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;
}

有没有其他更简单的有效方法来解决这个问题?

4

2 回答 2

1
return DSSome.Rows.OfType<DataRow>()
       .All(r => DSAll.Rows.OfType<DataRow>()
       .Where(x => (string)x["SID"] == (string)r["SID"]).Count() == 1)

这是使用 linq 查询来比较两组中的值。OfType<> 用于将 Rows 集合转换为Rows<DataRow>以使用 LINQ。如果所有行都符合条件,All() 将返回 true。否则返回 false。

于 2013-08-06T02:55:45.173 回答
1

这是另一种选择。它从 DSSOME 中获取所有 SID,除了那些出现在 DSALL 中的 SID。如果 DSSOME 中剩余的任何值在 DSALL 中不存在,.Any()则将返回true.

true然后您可以否定该值,因为如果DSSOME中没有任何剩余值,您想返回。

return !DSSome.Rows.Cast<DataRow>().Select(x => x["SID"])
              .Except(DSALL.Rows.Cast<DataRow>().Select(x => x["SID"])).Any();
于 2013-08-06T03:11:07.103 回答