检查DataTable中是否存在特定数据

时间:2013-08-06 02:49:49

标签: c# datatable

假设我有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;
}

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

2 个答案:

答案 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();