Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.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#_Business Logic - Fatal编程技术网

C# 是否有更好的方法编写业务逻辑来验证互斥代码?

C# 是否有更好的方法编写业务逻辑来验证互斥代码?,c#,business-logic,C#,Business Logic,我有两个属性。我需要根据显示兼容值的较大矩阵验证这些属性 示例属性: public string firstValue { get; set; } public string lastValue { get; set; } A B C A X O O B O X X C X O X if (firstValue == "A") { if (lastValue == "A" || lastValue =="C) Con

我有两个属性。我需要根据显示兼容值的较大矩阵验证这些属性

示例属性:

public string firstValue { get; set; }
public string lastValue { get; set; }
    A   B   C
A   X   O   O
B   O   X   X
C   X   O   X
if (firstValue == "A")
{
    if (lastValue == "A" || lastValue =="C)
        Console.WriteLine("Invalid Combination");
}
样本矩阵:

public string firstValue { get; set; }
public string lastValue { get; set; }
    A   B   C
A   X   O   O
B   O   X   X
C   X   O   X
if (firstValue == "A")
{
    if (lastValue == "A" || lastValue =="C)
        Console.WriteLine("Invalid Combination");
}
让x轴代表“firstValue”,y轴代表“lastValue”。程序必须验证由“X”表示的无效组合是否会向用户抛出错误

样本验证:

public string firstValue { get; set; }
public string lastValue { get; set; }
    A   B   C
A   X   O   O
B   O   X   X
C   X   O   X
if (firstValue == "A")
{
    if (lastValue == "A" || lastValue =="C)
        Console.WriteLine("Invalid Combination");
}
显然,可以使用if\else和switch逻辑以多种方式重构,但是当您向矩阵添加数百个值时,它开始变得可怕。我决定创建一个新类,在矩阵中每行包含一个函数

public class MutuallyExclusiveValidation
{
    public void CheckA(string lastValue)
    {
        if (lastValue == "A" || lastValue == "C")
        {
            Console.WriteLine("Invalid Combination");
        }
    }

    public void CheckB(string lastValue)
    {
        if (lastValue == "B")
        {
            Console.WriteLine("Invalid Combination");
        }
    }

    public void CheckC(string lastValue)
    {
        if (lastValue == "B" || lastValue == "C")
        {
            Console.WriteLine("Invalid Combination");
        }
    }
}
然后我设计了类似这样的东西,以确保我不会遇到超出需要的代码。谓词将返回一个布尔值,选择并调用需要运行的验证方法。(只是一个示例,而不是生产代码)

public static void CheckForMutuallyExclusiveValues(string firstValue,string lastvalue)
{
var allValidators=GetMutuallyExclusiveValidators(firstValue,lastvalue);
var requiredValidators=allValidators.First(x=>x.Key(firstValue));
var validationClassInstance=new MutuallyExclusiveValidation();
requiredValidators.Value(validationClassInstance);
}
公共静态字典GetMutuallyExclusiveValidators(string firstValue、string lastvalue)
{
var returnDictionary=newdictionary();
行动验证;
谓词条件;
验证=x=>x.CheckA(lastvalue);
条件=x=>x==“A”;
returnDictionary.Add(条件、验证);
验证=x=>x.CheckB(lastvalue);
条件=(x=>x==“B”);
returnDictionary.Add(条件、验证);
验证=x=>x.CheckC(lastvalue);
条件=(x=>x==“C”);
returnDictionary.Add(条件、验证);
返回字典;
}
这似乎很有效,但我忍不住想还有更好的方法。有什么想法吗


编辑:Fabjan的答案就是我对这个问题的答案。还要感谢Tim Schmelter。

创建一个2d数组,并使用某种方法验证记录,例如:

class MyClass
{
    bool[,] matrix = new bool[,]
    {            
        {false, true, false},  // x1 y123
        {true, false, true},   // x2 y123
        {true, false, false},  // x3 y123
    };

    string[] xValues = { "A", "B", "C" };
    string[] yValues = { "A", "B", "C" };

    public bool IsValid(string value1, string value2)
    {
        return matrix[Array.IndexOf(xValues, value1), Array.IndexOf(yValues, value2)];
    }
}


class Program
{
    static void Main()
    {
        MyClass c = new MyClass();

        Console.WriteLine(c.IsValid("A", "A"));

        Console.WriteLine(c.IsValid("B", "C"));

        Console.WriteLine(c.IsValid("A", "C"));

        Console.ReadKey();
    }
}
输出:


您可以使用
字典
将X值存储为键,将所有无效的Y值存储为值

Dictionary<string, HashSet<string>> InvalidValues = new Dictionary<string, HashSet<string>> { 
    {"A", new HashSet<string>{"A", "C"}},
    {"B", new HashSet<string>{"B"}},
    {"C", new HashSet<string>{"B", "C"}}
};
这一类:

public class Value
{
    public string FirstValue { get; set; }
    public string LastValue { get; set; }
}
和一些样本值:

var allValues = new List<Value> { 
    new Value { FirstValue = "A", LastValue = "C" }, 
    new Value { FirstValue = "A", LastValue = "B" }, 
    new Value { FirstValue = "B", LastValue = "C" }, 
    new Value { FirstValue = "A", LastValue = "A" } 
};
var allValues=新列表{
新值{FirstValue=“A”,LastValue=“C”},
新值{FirstValue=“A”,LastValue=“B”},
新值{FirstValue=“B”,LastValue=“C”},
新值{FirstValue=“A”,LastValue=“A”}
};

为什么
x=c | y=b
无效?@TimSchmelter-如果你引用矩阵,无效的组合(用“x”表示)是AA,AC,BB,CB,cc为什么你不能只做一个二维布尔数组并对照它进行检查?@TimSchmelter我可能写错了,但x轴(从左到右)排在第一位。@Tresto:有逻辑吗,因此,f.e.不能使用相同的第一个/最后一个值,或者矩阵是任意的/由用户预定义的?