7

もちろん、テキストプロパティに関してツリービューのノードを並べ替えようとしています。問題は、私の比較クラスが数値を気にしないことです。コードは次のとおりです。

public class TreeNodeSorter : IComparer
{
    public int Compare(object x, object y)
    {
        var tx = x as TreeNode;
        var ty = y as TreeNode;

        return string.Compare(tx.Text, ty.Text);
    }
}

そしてここに結果があります:

ここに画像の説明を入力してください

最初の子ノード(デバッグ...)は問題ありませんが、私の問題は、なぜ「HBM\D10」が「HBM\D7」の前にソートされるのかということです。

4

4 に答える 4

7

移植性が問題にならない場合は、 StrCmpLogicalW()を p/invoke できます。この関数は、表示するファイル名を並べ替えるために Windows シェルで使用されます。

public class TreeNodeSorter : IComparer
{
    [DllImport("shlwapi.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
    static extern int StrCmpLogicalW(string x, string y);

    public int Compare(object x, object y)
    {
        var tx = x as TreeNode;
        var ty = y as TreeNode;

        return StrCmpLogicalW(tx.Text, ty.Text);
    }
}
于 2012-07-11T10:28:25.153 に答える
1

http://www.dotnetperls.com/alphanumeric-sortingを読んでください。ただし、ソリューションを機能させるには、数値またはアルファベット順にソートするため、他のすべてを取り除く必要がある場合があります。

動的なファイル名の場合は、正規表現を使用して、並べ替えたい部分だけを一致させるのが最適な場合があります。

于 2012-07-11T10:29:00.090 に答える
0

数値を抽出する合理的なパターンがある場合 ( @"\D\d+" のようなものだと思います)、これを使用してラベルから数値を削除します。ラベルが等しい場合は、比較として 2 つの数値の差を返します。

于 2012-07-11T10:32:23.667 に答える
0

これは、文字「1」が文字「7」よりも小さいためです。これは、文字列が一度に 1 文字ずつ比較されるためです。

簡単な修正は、次のように、文字列の先頭にパディングされた 0 を含めることです。

D04
D07
D10
D11

等...

于 2012-07-11T10:29:31.720 に答える