【问题标题】:C# Compare rating values [closed]C#比较评级值[关闭]
【发布时间】:2017-07-05 19:25:48
【问题描述】:

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

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

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

感谢您的任何意见

【问题讨论】:

  • 不要使用字符串格式,或将字符串解析/映射为数字。创建一个字典,将评分映射到数字并使用数字进行比较。
  • 可能值得使用 4.0 规模,然后在实现 > 和
  • 从创建class RatingToString() 开始。然后只需添加IComparer。您可以在内部以enum 的成员的身份呈现各种评级,这将使其易于比较。

标签: c# icomparer


【解决方案1】:

枚举呢?它们天生具有可比性。

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

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

【讨论】:

  • 在我看来,解释一下关于属性的一次性评论是个好主意。
  • 我想,我可以有一个字典 来从我现有的字符串转换?
  • @FailedUnitTest - 只需使用 Enum.Parse 或 Enum.TryParse 即可。 Enum.Parse(typeof(Rating), stringRatingVal)
  • @FailedUnitTest 这取决于您希望解析的内容。 "D+" 不是有效标识符,因此您需要将 - 转换为 m 或使用字典来进行 Cress-reference。
【解决方案2】:

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

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

然后只需访问Ratings[UserJoe.Rating] &gt; Ratings["B"] 之类的评分,您就可以直接比较它们

编辑:您当然可以更进一步,并拥有一个class RatingComparator,它将其存储为private static Dictionary&lt;string, int&gt;,并公开一个为您比较两个评级字符串的函数(int CompareRatings(string rating1, string rating2))。

【讨论】:

    【解决方案3】:

    枚举工作得很好:

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

    【讨论】:

      【解决方案4】:

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

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

      我们可以通过填充leftright评级与','进行比较:"X+" &lt; "X," &lt; "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-
      

      【讨论】:

        猜你喜欢
        • 2013-01-15
        • 1970-01-01
        • 1970-01-01
        • 2011-06-09
        • 1970-01-01
        • 2019-03-13
        • 1970-01-01
        • 2013-10-11
        • 1970-01-01
        相关资源
        最近更新 更多