如何将列表与c#

时间:2017-03-31 13:42:19

标签: c# list enums

我有网站执行匹配操作。我正在编写代码来限制基于当前匹配阶段的一些操作。例如,如果前半部分是当前阶段,那么我应该限制直接结束比赛,而不是后半部分。对于每个阶段,我有多个限制阶段。以下是我的舞台枚举。

public enum MatchStage
    {
        FirstHalfAssumedStartTime = 1,
        FirstHalfAssumedEndTime = 2,
        SecondHalfAssumedStartTime = 3,
        SecondHalfAssumedEndTime = 4,
        ExtraFirstHalfAssumedStartTime = 5,
        ExtraFirstHalfAssumedEndTime = 6,
        ExtraSecondHalfAssumedStartTime = 7,
        ExtraSecondHalfAssumedEndTime = 8,
        PauseStartTime = 9,
        PauseEndTime = 10,
        EndMatchTime = 11
    }

我想在下面的方法工作。我想调用类似 currentSiteCoreStage.RestrictedStages 的东西,它返回受限制阶段的列表。我怎样才能做到这一点?

public static bool IsProposedStageValid(MatchStage currentSiteCoreStage, MatchStage proposedStage )
        {
            if (currentSiteCoreStage.RestrictedStages.Contains(proposedStage)) // I am hoping to make this work
                return false;
        }

3 个答案:

答案 0 :(得分:3)

这里有你的实际状态机。您可以创建方法,为应用程序支持的每个阶段定义可能的阶段转换。例如。 (当然你不必使用迭代器,你只需返回每个case块的阶段数组):

public static IEnumerable<MatchStage> GetAvailableStageTransitions(MatchStage stage)
{
    switch (stage)
    {
        case MatchStage.FirstHalfAssumedStartTime:
            yield return MatchStage.FirstHalfAssumedEndTime;
            yield return MatchStage.PauseStartTime;
            yield break;
        case MatchStage.SecondHalfAssumedStartTime:
            yield return MatchStage.SecondHalfAssumedEndTime;
            yield return MatchStage.PauseStartTime;
            yield break;
        // etc
        default:
            throw new NotSupportedException($"Stage {stage} is not supported.");
    }
}

然后检查建议的阶段是否可用:

GetAvailableStageTransitions(currentSiteCoreStage).Contains(proposedStage)

根据系统的复杂程度,您可以考虑将状态转换和对每个状态实现的逻辑封装到状态对象中。有关详细信息,请参阅State Design Pattern

答案 1 :(得分:0)

也许考虑这样的事情: 1:你的枚举

2:

public class Stage
{
    public MatchStage MathStage { get; set; }
    public List<MatchStage> PossibleStages { get; set; }
}

3。

public static bool IsProposedStageValid(Stage currentSiteCoreStage, MatchStage proposedStage)
{
     if (currentSiteCoreStage.PossibleStages.Contains(proposedStage)) // I am hoping to make this work
     return false;

     return true;
}

示例:

Stage st1 = new Stage
{
      MathStage = MatchStage.FirstHalfAssumedStartTime,
      PossibleStages = new List<MatchStage> { MatchStage.FirstHalfAssumedEndTime }
};

bool res = IsProposedStageValid(st1, MatchStage.PauseEndTime);

答案 2 :(得分:0)

一种方法是让一个类了解您当前的阶段,并根据当前阶段生成RestrictedStages。类似的东西:

public enum Stage
{
    First, Second, Third
}

public class CoreStage
{
    public Stage CurrentStage { get; private set; }

    public IEnumerable<Stage> RestrictedStages { get; private set; }

    public CoreStage(Stage currentStage)
    {
        CurrentStage = currentStage;
        RestrictedStages = GenerateRestrictedStages();
    }

    private IEnumerable<Stage> GenerateRestrictedStages()
    {
        //apply your logic to determine Restricted stages based on current stage.
        return null;
    }
}

现在,你的IsProposedStageValid方法看起来如下:

public static bool IsProposedStageValid(Stage currentSiteCoreStage, Stage proposedStage)
    {
        var coreStage = new CoreStage(currentSiteCoreStage);
        if (coreStage.RestrictedStages.Contains(proposedStage))
        {
            //do whatever you want.
        }
        return false;
    }