【问题标题】:Check all conditions before processing处理前检查所有条件
【发布时间】: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 列表可以包含以下规则:

  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;
    }

【问题讨论】:

  • 没有人会阅读您的条目。精确以获得准确的答案。
  • tl;博士;旁注:请避免使用“感谢信”,请随时在meta 上讨论。另请解释您对foreach 有什么问题,以及为什么您希望它不会按顺序遍历每个项目。
  • 我编辑了这个问题,我的问题是没有遍历所有顾问组中的所有规则,它找到了一种方法来确保规则中没有空白,并且每个学生都将被分配一个我开始处理之前的顾问。
  • 指定导师的学生人数是否有限制?如果没有,您只需要检查没有学生不能分配给任何可能的顾问。

标签: c# code-coverage crm rules


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-02-13
    • 2012-04-28
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多