0

学生情報を保存するために、DSALL と DSSome の 2 つの DataTables があるとします。

DSALL (すべての学生情報を保存)

SID (PK)
名前
住所
電話
...

DSSome (一部の特定の学生の SID のみを保存)

SID (固有)

ここで、DSSome のすべての SID が DSALL に存在するかどうかを確認する C# 関数が必要です。この関数は、すべての SID が DSALL に存在する場合は 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 クエリを使用して 2 つのセットの値を比較しています。OfType<> は、Rows<DataRow>LINQ を使用するために Rows コレクションを変換するために使用されます。All() は、すべての行が基準を満たした場合に true を返します。それ以外の場合は false を返します。

于 2013-08-06T02:55:45.173 に答える
1

別のオプションがあります。DSALL で発生するものを除いて、DSSOME からすべての SID を取得します。DSALL に存在しない値が DSSOME に残っている場合、.Any()は を返しtrueます。

次に、DSSOME に値が残っていないtrue場合に戻りたいので、値を否定することができます。

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 に答える