Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 处理前检查所有条件_C#_Code Coverage_Crm_Rules - Fatal编程技术网

C# 处理前检查所有条件

C# 处理前检查所有条件,c#,code-coverage,crm,rules,C#,Code Coverage,Crm,Rules,背景: 我正在建立一个系统,根据学生的属性和导师的接受程度为大学生指派学术顾问。现在我想检查一下,在我开始处理学生并将更改提交到CRM和Active Directory之前,是否可以为每个可能的学生分配一名顾问。大约有15000条记录,所以除非所有学生都有导师,否则我不想提交更改 我的当前系统有一个“AdvisorGroup”对象来保存“AdvisorRules”列表。我的“AdvisorRules”对象是从CRM填充的: class AdvisorRule { public Advis

背景:

我正在建立一个系统,根据学生的属性和导师的接受程度为大学生指派学术顾问。现在我想检查一下,在我开始处理学生并将更改提交到CRM和Active Directory之前,是否可以为每个可能的学生分配一名顾问。大约有15000条记录,所以除非所有学生都有导师,否则我不想提交更改

我的当前系统有一个“AdvisorGroup”对象来保存“AdvisorRules”列表。我的“AdvisorRules”对象是从CRM填充的:

class AdvisorRule
{
    public AdvisorCondition Condition { get; set; }
    public AdvisorField Field { get; set; }
    public String Value { get; set; }
}
建议条件
可以小于等于、大于等于或等于
AdivsorField
可以是学分(每位导师将接受多少学分)、国际学分(如果导师接受有意的学生)、荣誉(如果导师是否接受荣誉学生)和姓氏(导师将接受的姓氏)

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

  • AdvisorCondition=“Equal”AdvisorField=“International”值=否
  • AdvisorCondition=“Equal”AdvisorField=“honors”值=否
  • AdvisorCondition=“LessThanEqual”AdvisorField=“Credit”值=89
  • AdvisorCondition=“Equal”AdvisorField=“LastName”值=A
  • AdvisorCondition=“Equal”AdvisorField=“LastName”值=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;
        }
    
    private bool checkRuleCoverage()
    {
    //以某种方式在此处生成可能的场景列表
    foreach(可能场景列表中的可能场景)
    {
    bool覆盖=发现(可能情况);
    如果(!covered){抛出错误并返回}
    }
    }
    发现了私有对象(列出adGroups、可能的ESCENARIO ps)
    {
    foreach(adGroups中的AdvisorGroup advisor)
    {
    foreach(advisorrules中的AdvisorRule规则)
    {
    如果(advisor.rules==ps)
    返回true;
    }
    }
    返回false;
    }
    
    如果您的所有学生记录都在数据库中,那么解决方案就是使用带有适当索引的集合逻辑来获得答案。例如,您可以编写自己的解决方案,以便按照advisor规则适用的每个可能值对学生团体进行排序

    然后,在不迭代的情况下(尽管您已经迭代了排序),您可以找到某列上x以下或y以上的所有学生,然后将其与另一个统计上的范围之外的学生进行比较,依此类推。毛47的评论表明,任何学生在所有数据范围之外都是不可取的

    当然,在用C语言编写代码的过程中,您可以迭代advisor规则,找到范围的值,并将其应用到SQLServer或MySQL上的select或任何基于集合的DB中的where子句


    当然,这种粗略的检查忽略了部分规则集的可能性,即一名学生超出了除1条顾问规则以外的所有规则的范围,而这1条规则是不够的,因为顾问还有其他要求。为了解决这个问题,您必须有多个advisor规则集范围,或者更确切地说,在最坏的情况下,您将迭代所有advisor规则。只要学生在规则属性上的分数被正确索引,在DB中这样做可能仍然可以。

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