【感悟】——逻辑的重要性[续]+Dictionay
来源:互联网 发布:邓丽君 知乎 编辑:程序博客网 时间:2024/06/05 01:19
继上篇博客《逻辑的重要性》中的demo的逻辑写好后,又叫四姐审核了一下。咳咳,成长空间还是有的。so,继续分享给大家。
为了方便大家对比,我把上一篇的demo拿过来了:
string studentID = teacherCourseList[0].StudentID; List<EvaluationAssessRecordEntitity> record = new List<EvaluationAssessRecordEntitity>(); //根据学号在评估记录里查询出该学生的评估记录,最多为该学生的课程数,即最多10条。-赵寒-2016-3-13 //目前为止,进行了一次IO操作。 record = this.DbSession.StateEvalDal.QueryRecordByStudentID(studentID); //评估状态默认为尚未评估-赵寒-2016-3-13 assessStatus.AssessStatus ="尚未评估"; //循环查询出的评估记录 for (int i=0,i<record.Count,i++) { //循环该学生的课程 for(int j=0,j<teacherCourseList.Count,j++) { //如果两个信息的ID相同,说明该课程已评估,则评估状态返回已评估。 if(record[i].EvaluationTeacherCourseEntityTeacherCourseId==teacherCourseList[j].ID) { assessStatus.AssessStatus ="已评估"; } } }细心的可能又已经发现了。我的代码中存在一个双层for循环。该模块的逻辑是:学生登录后,查询出该学生的所有要评估的课程教师信息。然后根据教师、课程的ID查询该教师课程是否已经被评估了。如果存在评估记录,则为“已评估”,否则为尚未评估。若不了解,请看上篇博客。
而这个双层for循环,外层是查询出的评估记录(记录中的一个字段为教师课程ID),内层是教师课程ID。若评估记录中的教师课程ID与该生要评估的教师课程ID匹配上了。则为已评估。
也就是说。若存在5条已评估记录,该生需要评估的教师课程有10条。则每个学生需要进行5*10=50次循环。
如何优化呢。师姐提到了Dictionary。也就是字典。将list循环,改为Dictionary的Hash算法。
如:
//实例化集合,返回评估记录。 List<EvaluationAssessRecordEntitity> enRecord = new List<EvaluationAssessRecordEntitity>(); //通过学生ID查询出EvaluationAssessRecordEntitity里该学生的评估记录 enRecord = this.DbSession.StateEvalDal.QueryAssessRecordByStudentId(studentID); Dictionary<String, EvaluationAssessRecordEntitity> enRecord1 = new Dictionary<String, EvaluationAssessRecordEntitity>(); foreach (EvaluationAssessRecordEntitity enRecordSingle in enRecord) { enRecord1.Add(enRecordSingle.RecordId, enRecordSingle); } //如果存在评估记录,则遍历查看各课程是否被评估 if (enRecord.Count > 0) { foreach (var item in teacherCourseList) { //实例化一个实体,存放返回值 //List<EvaluationAssessStatus> assessStatus = new List<EvaluationAssessStatus>(); EvaluationAssessStatus assessStatus = new EvaluationAssessStatus(); //默认为尚未评估, assessStatus.AssessStatus = "尚未评估"; foreach (KeyValuePair<String, EvaluationAssessRecordEntitity> kvp in enRecord1) { if (item.ID == kvp.Value.EvaluationTeacherCourseEntityTeacherCourseId) { assessStatus.AssessStatus =kvp.Value.AssessStatus; break; } } ...... assessStatusList.Add(assessStatus); } }但是这里,并没有把dictionary的作用发挥到极致。自我分析应是场景不太适合。若第一层foreach循环的记录能当做dictionary的key值的话,就能将循环由50次,降至10次。
但虽然现在还是两层foreach循环,但利用Dictionary比之前的性能也会好一些(听说,未验证)。so,这个过程就当了解新知识点了。在此,也跟大家对比一下list和dictionary:
一句话:list的机制是循环,Dictionary的机制是Hash算法。即:若list和dictionary中分别有10条数据,最坏的情况下,从list中找到该数据需要循环10次,从dictionary中只需要一次。
推荐一篇文章,关于List和Dictionary的:点此查看。
从上篇博客,到这篇博客,包括其中与四姐交流,感觉收获很多,自己也思考了很多(相对之前)。不怕不知道,就怕不知道。真的,感觉自己不知道(后者)的太多了。so,我们一定要多交流,多分享,这样才能知道自己还有多少不知道。脑袋里有了料,再来看逻辑,才能理出好的逻辑,否则,“永远觉得自己是对的”。
1 0
- 【感悟】——逻辑的重要性[续]+Dictionay
- 【感悟】——逻辑的重要性-循环里不要套IO操作
- 进阶之路——逻辑与思维的重要性
- 逻辑正确的重要性
- 代码规范的重要性感悟
- 一点感悟:反馈的重要性
- 逻辑的重要性,函数篇
- 逻辑算法题——思路感悟
- 2006.9.11随记-感悟身体的重要性
- 结合AWintro浅谈逻辑的重要性
- 编程习惯的重要性—
- 小题大作—技术的重要性
- 论序列图在设计交互逻辑的重要性
- 【Volley】网络操作和逻辑操作顺序的重要性
- IT面试——激情的重要性
- 泛型的重要性——举例说明
- SQL SERVER——索引的重要性
- SQL SERVER——索引的重要性
- 程序员的自我修养——静态链接
- 如何安装Sublime Text 3汉化插件
- PHP $_GET五种提交形式
- mysql 5.6.29 绿色版安装
- HDOJ 1045 Fire Net
- 【感悟】——逻辑的重要性[续]+Dictionay
- 蚁群算法解决tsp问题
- Java - GUI
- Week 11:Application:Photo OCR课后习题解答
- bash特性详解 课堂笔记
- 北化oj 2107- 程序改错 - 变量初始化
- php:获取字符串的长度
- (C语言打印图形题4)编程,输入n,输出如下例(n=4)所示的高为n的倒立等腰三角形。
- POJ Knight Moves(BFS呀,但也有坑呀)