C# 比较评级值

C# Compare rating values

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

我希望能够比较它们,这样我就可以建立如下规则:如果 UserJoe.Rating > Ratings.B 给他特别优惠。

我对 IComparer 的想法有点陌生,推荐的构建方法是什么?

感谢任何意见

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

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

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

枚举工作正常:

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)
  ...

我的理解是,您现在正在使用字符串,因此要使其与您现有的兼容,您可以这样做。查找时间是 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) ).

如果您有 string 个要比较的比率表示,您可以使用 技巧:因为

   '+' == 0x2B
   ',' == 0x2C
   '-' == 0x2D

我们可以通过 填充 来比较 leftright 评分与 ','"X+" < "X," < "X-"

   int compare = string.Compare(
     left.PadRight(2, ','), 
     right.PadRight(2, ','), 
     StringComparison.OrdinalIgnoreCase);

例如,让我们整理出 ratings 的数组,给定为 strings:

   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));

结果:

   A+, A-, B+, B, B-, E, F, F-