【发布时间】:2013-01-06 13:24:10
【问题描述】:
我教一门 9 个单元的课程,学生可以通过每个单元以“及格”、“优异”或“优异”的成绩通过。 A P 得 70 分,M 得 80 分,D 得 90 分。今年的总成绩是所有单元的总分。
他们需要在允许“M”标准之前通过所有“P”标准,并且在允许“D”标准之前他们需要所有“M”标准。 P/M/D 标准的数量因单位而异。以下学生在本单元中取得了“及格”(70 分),因为即使他获得了所有 D 标准,但他没有获得 M:
单元 1 - 脑外科
P1 - 知道大脑在哪里 - 通过
P2 - 知道哪条路向上 - 通过
M1 - 解释大脑的作用 - 通过
M2 - 男性和女性大脑之间是否存在差异 - 失败
D1 - 弄清楚为什么我的大脑无法解决这个问题 - 通过
D2 - 发明一种可以让大脑立即找出逻辑的药物 - 通过
D3——想办法靠脑力赚大钱——通过
我有一个 SqlDataReader,它用以下列填充 DataTable:unitNo、criteriaName、criteriatype(即 P/M/D)、passedOrFailed。该查询已按个别学生进行选择,因此 DataTable 仅包含一名学生的记录。它看起来像这样:
UnitNo Citerion Type passed?
1 know etc P Yes
1 know etc P Yes
1 explain etc M Yes
1 is there etc M No
1 Figure etc D Yes
1 invent etc D Yes
1 find etc D Yes
2 blah etc P Yes
2 wot etc P Yes
2 so etc M No
我正在寻找一个看起来像这样的数据表:
UnitNo P M D Points
1 Y N Y 70
2 Y Y N 80
3 N N N 0
4 N Y Y 0
5 Y Y Y 90
...
...
…………
最后总分 - 学生有 240 分。
我对 DataTables、c# 等非常满意
有没有人有一些关于整理这个逻辑的指针?就像古尔蒙哈斯特学校里的场景……如果你能解决的话,我会亲自派老婆去给你做周日烤肉。
电脑
好的,这是包含 CSharper 答案的实际代码(也进行了编辑以添加他的额外列名的解决方案)。这显然是正确的解决方案,我只是没有完全让数字出现(我发现他在 DataRow 演员表后遗漏了括号,但这不是问题)。我在最后连接了几个测试网格以显示结果。另外我不是 linq 人,所以我不知道如何将第一个表中的单位名称添加到第二个表中,或者总分:
(注意,我使用的是 1= 未标记,2 = 失败,3 = 通过 passFail 字段)
//create the sql to extract the data
String sqlString = "SELECT unitNo, unitName, criterionPMD, passFail FROM unitDetails INNER JOIN unitStudentRecord ON unitDetails.id = unitStudentRecord.unitDetailsId INNER JOIN unitSummary ON unitDetails.unitSummaryId = unitSummary.id WHERE studentID = '" + ((String)Session["studentID"]).Trim() + "'";
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["studentTutorialsConnectionString"].ConnectionString);
SqlCommand sqlComm = new SqlCommand(sqlString, conn);
conn.Open();
SqlDataReader sqlTotalMarks = sqlComm.ExecuteReader();
//create the workings out datatable and fill it
DataTable dtWorkings = new DataTable();
dtWorkings.Load(sqlTotalMarks);
conn.Close();
// create the results datatable
DataTable dtResults = new DataTable();
dtResults.Columns.Add("units", typeof(int));
dtResults.Columns.Add("name", typeof(string));
dtResults.Columns.Add("P", typeof(bool));
dtResults.Columns.Add("M", typeof(bool));
dtResults.Columns.Add("D", typeof(bool));
dtResults.Columns.Add("points", typeof(int));
//fill the results table
foreach (var units in dtWorkings.Rows.Cast<DataRow>().GroupBy(r => r["unitNo"]))
{
var p = units.Where(r => r["criterionPMD"] == "P").All(r => r["passFail"] == "3");
var m = units.Where(r => r["criterionPMD"] == "M").All(r => r["passFail"] == "3");
var d = units.Where(r => r["criterionPMD"] == "D").All(r => r["passFail"] == "3");
dtResults.Rows.Add(
units.Key,//UnitNo
units.Select(r => r["unitName"]).First(),//UnitName
p,
m,
d,
p ? (m ? (d ? 90 : 80) : 70) : 0);//Points
}
gvTemp.DataSource = dtWorkings;
gvTemp.DataBind();
gvSummary.DataSource = dtResults;
gvSummary.DataBind();
这是 gvTemp 的网格:
unitNo unitName criterionPMD passFail
2 Computer systems P 3
2 Computer systems P 1
3 Web rubbish P 3
这是 gvSummary 的网格:
units name P M D points
2 Computer systems 90
3 Web rubbish 90
在 gvSummary 网格中,所有 PMD 标准都出现了勾选的复选框,但没有总计。我期待第 2 单元的分数为零,第 3 单元的分数为 70 分……
太近了……
【问题讨论】: