背景:
我正在建立一个系统,根据学生的特点和导师的接受程度,为大学生分配学术顾问。现在,我想检查一下,在我开始处理学生并提交对我们的CRM和Active Directory的更改之前,是否可以为每个可能的学生分配一个顾问。大约有15,000份记录,所以我不想修改,除非所有的学生都有一个导师。
我的当前系统有一个“AdvisorGroup”对象,用于保存“AdvisorRules”的列表。我的“AdvisorRules”对象是从CRM中填充的:
class AdvisorRule
{
public AdvisorCondition Condition { get; set; }
public AdvisorField Field { get; set; }
public String Value { get; set; }
}AdvisorCondition可以是LessThanEqual、GreaterThanEqual或Equal。AdivsorField可以是信用(每个顾问将接受多少学分)、国际(如果顾问接受有意的学生)、荣誉(如果顾问接受荣誉学生或不接受)和lastName(顾问将接受姓氏)。
“‘Value”是与“AdvisorField”相比较的目标。例如,AdvisorRules在AdvisorGroup中的列表可以包含以下规则:
这位导师将接受一个姓A或B,学分少于89个学分的学生,而不是一个国际或优秀的学生。
问题:
在我开始处理之前,是否有一种检查方法来确保每个可能的学生都会被指派一位顾问?我试图在我的编码中不太明确。我在想类似的事情,但如果我能找到更好的方法,我就愿意重新设计:
private bool checkRuleCoverage()
{
//somehow generate list of possible scenarios here
foreach (possible scenario in list of possible scenarios)
{
bool covered = isCovered(possible scenario);
if(!covered) {throw error and return}
}
}
private bool isCovered(List<AdvisorGroup> adGroups, possibleScenario ps)
{
foreach (AdvisorGroup advisor in adGroups)
{
foreach (AdvisorRule rule in advisor.rules)
{
if(advisor.rules == ps)
return true;
}
}
return false;
}发布于 2013-08-02 18:52:03
如果您的所有学生记录都在数据库中,那么解决方案将是使用set逻辑和适当的索引来获得答案。例如,您可以编写自己的解决方案,以便按照顾问规则适用的每个可能值对学生进行排序。
然后,不进行迭代(尽管为了排序已经迭代过),您可以在某一列火车上找到x以下或y以上的所有学生,然后将其与在另一个stat上超出范围的学生进行比较,等等。在所有统计数据中,任何学生,如毛47的评论,都暗示这是不可取的。
当然,在用C#编写这段代码的时间里,您只需遍历顾问规则并找到范围的值,并将其应用到SQLServer或MySQL上的select或MySQL或任何基于集合的DB中的where子句。
当然,这种粗略的检查漏掉了部分规则集的可能性,其中一个学生超出了除一个顾问规则以外的所有规则的范围,而那一个规则是不够的,因为顾问也有其他的要求。为了解决这个问题,您必须有多个顾问规则集范围,或者更确切地说,在最坏的情况下,您将遍历所有的顾问规则。只要学生在规则上的分数被正确地编入索引,在DB中这样做可能还是可以的。
https://stackoverflow.com/questions/18023539
复制相似问题