Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.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#_Enums - Fatal编程技术网

C# 如何基于当前值指定枚举可以具有的值?

C# 如何基于当前值指定枚举可以具有的值?,c#,enums,C#,Enums,我正在寻找一种方法来指定一个让我们称之为决策树或流的方法 我有一个起始值1或已请求,此枚举可以有多个以下值,如2或正在进行或3或已拒绝 现在只有从值2开始,才有可能得到更高的值,比如4或FINISHED 定义流程或流可能具有的路径的最实用的方法是什么?您可以做一些事情来利用枚举基本上只是整数: private static Status NextState(Status status) { var intOfStatus = ((int)status) + 1; return (

我正在寻找一种方法来指定一个让我们称之为决策树或流的方法

我有一个起始值1或已请求,此枚举可以有多个以下值,如2或正在进行或3或已拒绝

现在只有从值2开始,才有可能得到更高的值,比如4或FINISHED

定义流程或流可能具有的路径的最实用的方法是什么?

您可以做一些事情来利用枚举基本上只是整数:

private static Status NextState(Status status)
{
    var intOfStatus = ((int)status) + 1;
    return (Status)intOfStatus;
}
以及基于此方法的一些示例逻辑:

public enum Status
{
    NotStarted = 0,
    Started = 1,
    InProgress = 2,
    Declined = 3
}
public static void Main()
{
    var curStatus = Status.NotStarted;

    Console.WriteLine(curStatus.ToString()); //writes 'NotStarted'

    if ((int)curStatus++ == (int)Status.Started)
    {
        curStatus = Status.Started; 
    }

    Console.WriteLine(NextState(curStatus)); //writes 'InProgress'
}
您可以做一些事情来利用枚举基本上只是整数:

private static Status NextState(Status status)
{
    var intOfStatus = ((int)status) + 1;
    return (Status)intOfStatus;
}
以及基于此方法的一些示例逻辑:

public enum Status
{
    NotStarted = 0,
    Started = 1,
    InProgress = 2,
    Declined = 3
}
public static void Main()
{
    var curStatus = Status.NotStarted;

    Console.WriteLine(curStatus.ToString()); //writes 'NotStarted'

    if ((int)curStatus++ == (int)Status.Started)
    {
        curStatus = Status.Started; 
    }

    Console.WriteLine(NextState(curStatus)); //writes 'InProgress'
}

实用的往往是最容易阅读和理解的。为此,我建议明确哪些国家可以导致哪些其他国家。
enum
只是一个可能值的列表。使用
enum
int
值可能看起来更简洁,但它更难阅读,并可能导致其他问题

首先,这里有一个
enum
和一个简单的类,如果允许更改,它可以从一个状态更改为另一个状态。(我没有涵盖所有州。)

如果我们基于
\u state
的数值并确定该数字只能上升,则可能会出现一些问题:

  • 有些人可以重新排列枚举或添加新的枚举,而不知道数值或位置具有逻辑意义。这是一个容易犯的错误,因为该值通常并不重要
  • 您可能需要实现不太简单的逻辑。您可能需要一个状态,该状态前面可以有一些值,但不是所有值
  • 你可能会意识到倒退是有充分理由的。如果请求被拒绝,并且将来您确定要重新打开请求,从而有效地将它们发送回所请求的
    ,该怎么办

如果这种实现方式开始时有点奇怪,那么这些更改可能会使更改和遵循变得更加困难。但是,如果你只是清楚地描述在任何状态下可能发生的变化,那么它将很容易阅读和修改。

实用的往往是最容易阅读和理解的。为此,我建议明确哪些国家可以导致哪些其他国家。
enum
只是一个可能值的列表。使用
enum
int
值可能看起来更简洁,但它更难阅读,并可能导致其他问题

首先,这里有一个
enum
和一个简单的类,如果允许更改,它可以从一个状态更改为另一个状态。(我没有涵盖所有州。)

如果我们基于
\u state
的数值并确定该数字只能上升,则可能会出现一些问题:

  • 有些人可以重新排列枚举或添加新的枚举,而不知道数值或位置具有逻辑意义。这是一个容易犯的错误,因为该值通常并不重要
  • 您可能需要实现不太简单的逻辑。您可能需要一个状态,该状态前面可以有一些值,但不是所有值
  • 你可能会意识到倒退是有充分理由的。如果请求被拒绝,并且将来您确定要重新打开请求,从而有效地将它们发送回所请求的
    ,该怎么办

如果这种实现方式开始时有点奇怪,那么这些更改可能会使更改和遵循变得更加困难。但是,如果您只是清楚地描述在任何状态下可能发生的更改,那么它将很容易阅读和修改。

我建议使用某种状态机定义业务规则的类/函数。使用当前值调用该函数,并让所有可能的值首先返回下一个逻辑值。我们通常使用按位运算和int。我建议使用排序的状态机定义业务规则的类/函数。用当前值调用它,并让所有可能的值首先返回下一个逻辑值。我们过去使用逐位运算和int。尽管我更明确地回答了这个问题。实际上,我会更倾向于这条路线(并据此投票)。我可以想象,在极少数情况下,迭代可能的状态将真正成为最终目标,但谁知道呢!尽管我对这个问题的回答更加明确。实际上,我会更倾向于这条路线(并据此投票)。我可以想象,在极少数情况下,迭代可能的状态将真正成为最终目标,但谁知道呢!