private bool test(int x, int y, int z)
{
    int[] arr = {x,y,z};
    switch (arr)
    {
        case {4,5,6}:
            return true;
        case {1,2,3}:
            return true;
        case {7,8,9}:
            return true;
        default:
            return false;
    }
}


本质上,我想创建一个执行此操作的函数。但是,不能在switch语句内使用数组值。我将如何完成这样的事情?我并不是很想做一堆if语句,大约会有300种可能的组合。

为了进一步说明,该函数在找到大小写的情况下始终返回true,而在没有找到大小写的情况下始终返回false。 (订单事项)

一种可能的解决方案是将x y z值转换为字符串“ x y z”,然后使用〜300个字符串值。但这似乎很hacky。

最佳答案

使用HashSet可以促进有效组合。然后搜索是否给定的x,y,z组合是使用Contains完成的,并且HashSet本身是O(1)

HashSet<(int a, int b, int c)> options = new HashSet<(int a, int b, int c)>
{
    (4,5,6),
    (1,2,3),
    (7,8,9),
    // ... the rest of the cases
};

options.Contains((x, y, z));


对于C#7.0之前的版本,请使用:

HashSet<Tuple<int, int, int>> options = new HashSet<Tuple<int, int, int>>
{
    Tuple.Create(4,5,6),
    Tuple.Create(1,2,3),
};

options.Contains(Tuple.Create(x, y, z));


请注意,对300个案例进行硬编码(或任意数量的案例对硬编码)不是一个好习惯。我建议重新考虑如何存储这些值。您可以将它们存储在数据库或配置文件中并加载它们。然后按照我的建议在HashSet中加载存储。



至于switch case,请注意,如果您在不同情况下的行为相同,则可以:

switch (caseSwitch) {
    case 1:
    case 2:
    case 3:
    case 4:
        return true;
    default:
        return false;
}

关于c# - 在多种情况下,我如何做出类似于switch语句的内容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46348712/

10-14 23:59