C#比较评级值

时间:2017-02-16 15:26:39

标签: c# icomparer

我的公司为其用户提供评级系统(现在是字符串格式)。该系统是典型的A +,A,A-,B +,B ... F

我希望能够比较它们,以便我可以构建如下规则:if UserJoe.Rating> Ratings.B给他特别优惠。

我对IComparer的想法有点新意,建议采用什么方法?

感谢任何输入

4 个答案:

答案 0 :(得分:3)

枚举怎么样?它们本身具有可比性。

public enum Rating
{
    F  = 0,
    [Description("D-")]
    Dm = 1,
    D  = 2,
    [Description("D+")]
    Dp = 3,
    [Description("C+")]
    Cm = 4,
...
}

您还可以添加属性以使用"D+""C-"作为显示名称。

答案 1 :(得分:1)

我的理解是你现在正在使用字符串,以便与你所拥有的字符串兼容。查找时间是 O(1)因为词典所以它总是表现良好,只需要调整的是数字(我个人开始很高,所以在添加新值时,您不需要重写所有值。)

Dictionary<string, int> Ratings = new Dictionary<string, int>() {
    { "A+", 6 },
    { "A", 5 },
    { "A-", 4 },
    { "B+", 3 },
    { "B", 2 }
};

然后只需访问Ratings[UserJoe.Rating] > Ratings["B"]等评分即可直接比较

编辑:您当然可以更进一步,并使用class RatingComparator将其存储为private static Dictionary<string, int>,并公开一个函数,为您比较两个评级字符串(int CompareRatings(string rating1, string rating2))。

答案 2 :(得分:0)

Enums工作正常:

public enum Ratings
{
  Fm,  // F-
  F,   // F
  Fp,  // F+
  Em,  // E-
  E,   // E
  Ep,  // E+
  Dm,  // D-
  D,   // D
  Dp,  // D+
  Cm,  // C-
  C,   // C
  Cp,  // C+
  Bm,  // B-
  B,   // B
  Bp,  // B+
  Am,  // A-
  A,   // A
  Ap   // A+
}

public class User
{
  public string Name { get; set; }
  public Ratings Rating { get; set; }
  public User(string name, Ratings rating)
  {
    Name = name;
    Rating = rating;
  }
}

...

var user1 = new User("Joe", Ratings.Bp);
var user2 = new User("Alex", Ratings.D);

if (user1.Rating > user2.Rating)
  ...

答案 3 :(得分:0)

如果您要比较费率的while (true)表示,则可以使用技巧:自

string

我们可以通过填充 '+' == 0x2B ',' == 0x2C '-' == 0x2D left评分与right进行比较:','

"X+" < "X," < "X-"

例如,让我们将 int compare = string.Compare( left.PadRight(2, ','), right.PadRight(2, ','), StringComparison.OrdinalIgnoreCase); 数组排序为ratings

string

结果:

   string[] ratings = new string[] {
     "F-", "A+", "B", "B-", "B+", "A-", "F", "E"
   };

   // Inplace sorting
   Array.Sort(ratings, (left, right) => string.Compare(
     left.PadRight(2, ','), 
     right.PadRight(2, ','), 
     StringComparison.OrdinalIgnoreCase));

   // Alternative Linq version
   var sortedRatings = ratings
     .OrderBy(rating => rating.PadRight(2, ','))
     .ToArray();

   Console.Write(string.Join(", ", ratings));