0

背景:

我正在建立一个系统,根据学生的属性和顾问的接受度为大学生分配学术顾问。现在,我想在开始处理学生并对我们的 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可以是学分(每个顾问将接受多少学分)、国际(如果顾问接受有意的学生)、荣誉(如果顾问是否接受荣誉学生)和姓氏(顾问将接受的姓氏。)

“Value”是与“AdvisorField”进行比较的目标。例如,AdvisorGroup 中的 AdvisorRules 列表可以包含以下规则:

  1. AdvisorCondition = "Equal" AdvisorField = "International" Value = No
  2. AdvisorCondition = "Equal" AdvisorField = "honors" Value = No
  3. AdvisorCondition = "LessThanEqual" AdvisorField = "Credit" Value = 89
  4. AdvisorCondition = "Equal" AdvisorField = "LastName" Value = A
  5. 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;
    }
4

1 回答 1

0

如果您将所有学生记录都保存在数据库中,那么解决方案是使用带有适当索引的集合逻辑来获得答案。例如,您可以编写自己的解决方案,以便根据顾问规则适用的每个可能值对学生群体进行排序。

然后,无需迭代(尽管您已经迭代以进行排序),您可以在某列火车上找到所有低于 x 或高于 y 的学生,然后将其与另一个统计数据范围之外的学生进行比较,依此类推. 任何超出所有统计数据范围的学生(如 Mao47 的评论)都是不可取的。

当然,在你用 C# 编写代码的时候,你可能只是迭代了顾问规则并找到了范围的值,并将其应用于 SQLServer 或 MySQL 或任何已设置的 DB 上的 select 中的 where 子句 -基于。

当然,这种粗略检查忽略了部分规则集的可能性,其中学生超出了除 1 条指导规则之外的所有规则的范围,然后该 1 条规则是不够的,因为指导也有其他要求。为了解决这个问题,您必须拥有多个顾问规则集范围,或者更确切地说,在最坏的情况下您将遍历所有顾问规则。只要正确索引学生在规则属性上的分数,在数据库中执行此操作可能仍然可以。

于 2013-08-02T18:52:03.850 回答