【问题标题】:How to implement rank structure如何实现等级结构
【发布时间】:2010-06-15 16:33:23
【问题描述】:

实施等级系统的最佳方法是什么:

这是我将使用的代码

public class MyRank
{
    private int LevelOneMaxPoints = 100;
    private int LevelTwoMinPoints = 200;
    private int LevelTwoMaxPoints = 299;
    private int LevelThreeMinPoints = 300;
    private int LevelThreeMaxPoints = 399;
    private int LevelFourMinPoints = 400;
    private int LevelFourMaxPoints = 599;
    private int LevelFourPlusMinPoints = 600;
    private int LevelFourPlusMaxPoints = 999;
    private int LevelFiveMinPoints = 1000;
    private int LevelFiveMaxPoints = 1299;
    private int LevelSixMinPoints = 1300;
    private int LevelSixMaxPoints = 2699;
    private int LevelSevenMinPoints = 2700;
    private int LevelSevenMaxPoints = 3999;
    private int LevelEightMinPoints = 4000;
    private int LevelEightMaxPoints = 5499;
    private int LevelEightPlusMinPoints = 5500;
    private int LevelEightPlusMaxPoints = 7499;
    private int LevelNineMinPoints = 7500;
    private int LevelNineMaxPoints = 9999;
    private int LevelTenMinPoints = 10000;

    private string LevelOneName = "Private";
    private string LevelTwoName = "PV2";
    private string LevelThreeName = "Private Fist Class";
    private string LevelFourName = "Specialist";
    private string LevelFourPlusName = "Corporal";
    private string LevelFiveName = "Sergeant";
    //private string LevelSixName = "Staff Sergeant";
    private string LevelSevenName = "Sergeant First Class";
    private string LevelEightName = "Master Sergeant";
    private string LevelEightPlusName = "First Sergeant";
    private string LevelNineName = "Sergeant Major";
    //private string LevelTenName = "Sergeant Major of the Answers";
    private int points = 0;

    public string RankName { get; private set; }
    public MyRank(int points)
    {
        this.points = points;
        RankName = GetRankName();
    }

    private string GetRankName()
    {
        if (points >= Int32.MinValue && points <= LevelOneMaxPoints)
            return LevelOneName;
        else if (points >= LevelTwoMinPoints && points <= LevelTwoMaxPoints)
            return LevelTwoName;
        else if (points >= LevelThreeMinPoints && points <= LevelThreeMaxPoints)
            return LevelThreeName;
        else if (points >= LevelFourMinPoints && points <= LevelFourMaxPoints)
            return LevelFourName;
        else if (points >= LevelFourPlusMinPoints && points <= LevelFourPlusMaxPoints)
            return LevelFourPlusName;
        else if (points >= LevelFiveMinPoints && points <= LevelFiveMaxPoints)
            return LevelFiveName;
        else if (points >= LevelSixMinPoints && points <= LevelSixMaxPoints)
            return LevelFiveName;
        else if (points >= LevelSevenMinPoints && points <= LevelSevenMaxPoints)
            return LevelSevenName;
        else if (points >= LevelEightMinPoints && points <= LevelEightMaxPoints)
            return LevelEightName;
        else if (points >= LevelEightPlusMinPoints && points <= LevelEightPlusMaxPoints)
            return LevelEightPlusName;
        else if (points >= LevelNineMinPoints && points <= LevelNineMaxPoints)
            return LevelNineName;
        else if (points >= LevelNineMinPoints && points <= LevelNineMaxPoints)
            return LevelNineName;
        else if (points >= LevelTenMinPoints)
            return LevelFourName;
        else
            return "No Rank";
    }
}

你认为这是最有效的方法吗?

【问题讨论】:

    标签: c# asp.net ranking


    【解决方案1】:

    我会首先将您的级别转换为单个枚举。每个 Enum 的值可以是最小值,不需要跟踪最大值,如下所示。

    public enum Level
    {
        [Description("Private")]
        One = 0,
        [Description("PV2")]
        Two = 200,
        [Description("Private Fist Class")]
        Three = 300,
        ...
        ...
        [Description("Sergeant Major of the Answers")]
        Ten = 10000
    }
    

    那么你可以这样写来获取名字:

    string GetRankName(Level level)
    {
        FieldInfo fieldInfo = level.GetType().GetField(level.ToString());
        DescriptionAttribute[] attributes = (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);
        return (attributes.Length > 0) ? attributes[0].Description : level.ToString();        
    }
    

    这是为了获得关卡

    Level GetLevel(int points)
    {
        Level level = Level.One;
        foreach(int i in Enum.GetValues(typeof(Level)))
        {
            if (points < i) break;
            level = (Level)i;
        }
        return level;
    } 
    

    那么您的对象成员将是:

    public Level Level { get; set; }
    public string RankName { get; set; }
    public MyRank(int points)
    {
        Level = GetLevel(points);
        RankName = GetRankName(Level);
    }
    

    【讨论】:

    • 我收到语法错误 - 找不到类型或命名空间“描述”。我在属性上做错了吗?
    • 是的。我现在可以正常工作了。它更易于管理。非常感谢您的帮助
    【解决方案2】:

    你可以使用数组:

    private int[] levelPoints = new int[]{
        99, 299, 399, 599, 999, 1299, 2699, 3999, 5499, 7499, 9999
    };
    
    private string[] levelNames = new string[]{
        "Private", "PV2", "Private First Class", "Specialist", "Corporal",
        "Sergeant", "Staff Sergeant", "Sergeant First Class", "Master Sergeant",
        "First Sergeant", "Sergeant Major", "Sergeant Major of the Answers"
    };
    
    private int GetMinPointsOfLevel( int level ) {
        // I think, the levels starts from 1
    
        if ( level <= 1 ) { return 0; }
        else if ( level >= levelPoints.Lengtht ) { return levelPoints.Last(); }
        else { return levelPoints[level - 2] + 1; }
    }
    private int GetMaxPointsOfLevel( int level ) {
        if ( level <= 1 ) { return levelPoints[level - 1]; }
        else if ( level >= levelPoints ) { return int.MaxValue; }
        else { return levelPoints[level - 1]; }
    }
    private inte GetNameOfLevel( int level ) {
        if ( level < 1 ) { return levelNames[0]; }
        else if ( level >= levelPoints - 1 ) { return levelNames.Last(); }
        else { return levelNames[level - 1]; }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-24
      • 1970-01-01
      • 2019-09-25
      • 1970-01-01
      • 2015-10-14
      • 1970-01-01
      • 2011-02-07
      相关资源
      最近更新 更多