我的公司为其用户提供评级系统(现在是字符串格式)。该系统是典型的A +,A,A-,B +,B ... F
我希望能够比较它们,以便我可以构建如下规则:if UserJoe.Rating> Ratings.B给他特别优惠。
我对IComparer的想法有点新意,建议采用什么方法?
感谢任何输入
答案 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));