11

我想IComparer在 C# 中实现一个自定义字符串并将其应用于 ComboBox。

实际结果

如果我将ComboBox'Sorted属性设置为true,则输出为:

A
AA
AAA
B
BB
BBB

想要的结果

排序算法的期望行为如下(金融开发人员会理解原因:)):

AAA
AA
A
BBB
BB
B

问题

有可能吗?这里需要排序算法吗?

PS:我不需要完整的代码答案,我只需要知道如何完成它..

编辑

这是关于信用评级的。我在我的问题中省略了一些东西。评级必须按以下顺序排序:

XXX
XX+
XX
XX-
X+
X
X-

X in ('A','B','C')和_'A' > 'B' > 'C'

4

3 回答 3

6

这是一个主要实现的版本:

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从每个相应的字符串中获取字符对,直到结束,如果它们不相等则返回适当的值。如果它超过了那个,那么一个字符串从另一个开始。对于传统的字符串比较,我们只需按照与输入参数相同的顺序比较长度。由于我们实际上是根据长度颠倒顺序,请注意xandy在最后一行交换。这颠倒了比较逻辑。

于 2013-07-02T17:20:24.087 回答
2

假设这是针对信用评级的,通常这是通过在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));
    }
}
于 2013-07-02T17:18:25.983 回答
0

编写 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
于 2013-07-02T17:17:34.760 回答