C#中的自定义字符串比较
本文关键字:字符串 比较 自定义 | 更新日期: 2023-09-27 18:20:41
我想在C#中实现一个自定义字符串IComparer
,并将其应用于ComboBox。
实际结果
如果我将ComboBox
的Sorted
属性设置为true
,则输出为:
A
AA
AAA
B
BB
BBB
想要的结果
排序算法的预期行为如下(金融开发人员会理解原因:):
AAA
AA
A
BBB
BB
B
问题
有可能做到吗?这里需要排序算法吗?
附言:我不需要一个完整的代码答案,我只需要一个如何完成的想法。。
编辑
这是关于信用评级的问题。我的问题遗漏了一些内容。评级必须按以下顺序排序:
XXX
XX+
XX
XX-
X+
X
X-
具有X in ('A','B','C')
和'A' > 'B' > 'C'
这里有一个主要实现的版本:
public class MyComparer : IComparer<string>
{
public int Compare(string x, string y)
{
//todo null checks on input
var pairs = x.Zip(y, (a, b) => new { x = a, y = b });
foreach (var pair in pairs)
{
int value = pair.x.CompareTo(pair.y);
if (value != 0)
return value;
}
//if we got here then either they are the same,
//or one starts with the other
return y.Length.CompareTo(x.Length); //note x and y are reversed here
}
}
因此,它使用Zip
从每个对应的字符串中获取成对的字符,直到其中一个字符串结束,如果它们不相等,则返回适当的值。如果它超过了这个值,那么一个字符串从另一个字符串开始。对于传统的字符串比较,我们只需要按照与输入参数相同的顺序来比较长度。由于我们本质上是根据长度颠倒顺序,请注意,x
和y
在最后一行进行了交换。这颠倒了比较逻辑。
假设这是针对信用评级的,通常情况下,这是通过在CreditRating
类上设置一个"排序顺序"列来完成的,您可以使用该列对列表进行排序,然后将其指定为下拉列表的数据源。
但是,一个快速的解决方法(基于有限的可能值)是按第一个字母升序排序,然后按字符串长度降序排序:
if(left[0] != right[0])
return left[0].CompareTo(right[0]);
else
return right.Length - left.Length;
如果你想对订单进行更多的控制,另一种解决方法是以"正确"的顺序创建一个可能值的列表,然后使用它对列表进行排序:
public class MyComparer : IComparer<string>
{
private static readonly string[] Ratings = new [] {
"CC","C","CCC-","CCC","CCC+",
"B-","B","B+","BB-","BB","BB+","BBB-","BBB","BBB+",
"A-","A","A+","AA-","AA","AA+","AAA"};
// reverse the order so that any strings not found will be put at the end.
public int Compare(string left, string right)
{
return Array.IndexOf(Ratings, right).CompareTo(Array.IndexOf(Ratings, left));
}
}
编写IComparer,使其接受字符串,但按每个字符进行比较,
if A[0] == B[0] go to the next character.
if B[1] == null or A[1] < B[1], return A < B.
if A[1] == null or B[1] < A[1], return B < A.
if equal...continue as needed