【发布时间】:2013-08-02 18:12:15
【问题描述】:
背景:
我正在构建一个系统,根据学生的属性和顾问的接受度为大学生分配学术顾问。现在,我想在开始处理学生并对我们的 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 可以是 Credit(每个顾问将接受多少学分)、国际(如果顾问接受有意的学生)、荣誉(如果顾问接受荣誉学生)和 lastName(顾问将接受的姓。)
“Value”是与“AdvisorField”进行比较的目标。例如,AdvisorGroup 中的 AdvisorRules 列表可以包含以下规则:
- AdvisorCondition = "Equal" AdvisorField = "International" Value = No
- AdvisorCondition = "Equal" AdvisorField = "honors" Value = No
- AdvisorCondition = "LessThanEqual" AdvisorField = "Credit" Value = 89
- AdvisorCondition = "Equal" AdvisorField = "LastName" Value = A
- AdvisorCondition = "Equal" AdvisorField = "LastName" Value = B
该顾问将接受姓氏以 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;
}
【问题讨论】:
-
没有人会阅读您的条目。精确以获得准确的答案。
-
tl;博士;旁注:请避免使用“感谢信”,请随时在meta 上讨论。另请解释您对
foreach有什么问题,以及为什么您希望它不会按顺序遍历每个项目。 -
我编辑了这个问题,我的问题是没有遍历所有顾问组中的所有规则,它找到了一种方法来确保规则中没有空白,并且每个学生都将被分配一个我开始处理之前的顾问。
-
指定导师的学生人数是否有限制?如果没有,您只需要检查没有学生不能分配给任何可能的顾问。
标签: c# code-coverage crm rules