11

IComparerC# でカスタム文字列を実装し、ComboBox に適用したいと考えています。

実績

ComboBoxSortedプロパティをに設定する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、対応する各文字列から最後まで文字のペアを取得するために使用し、等しくない場合は適切な値を返します。それを過ぎると、一方のストリングが他方から始まります。従来の文字列比較では、入力パラメーターと同じ順序で長さを比較するだけでした。基本的に長さに基づいて順序を逆にしているため、最後の行でxyが入れ替わっていることに注意してください。これは比較ロジックを逆にします。

于 2013-07-02T17:20:24.087 に答える