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
我们可以通过 填充 来比较 left
和 right
评分与 ','
:"X+" < "X," < "X-"
int compare = string.Compare(
left.PadRight(2, ','),
right.PadRight(2, ','),
StringComparison.OrdinalIgnoreCase);
例如,让我们整理出 ratings
的数组,给定为 string
s:
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-
我的公司有一个用户评级系统(现在是字符串格式)。该系统是典型的,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
我们可以通过 填充 来比较 left
和 right
评分与 ','
:"X+" < "X," < "X-"
int compare = string.Compare(
left.PadRight(2, ','),
right.PadRight(2, ','),
StringComparison.OrdinalIgnoreCase);
例如,让我们整理出 ratings
的数组,给定为 string
s:
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-