2

グリッドでソートしようとしている文字列値の長いリストがあります。最初は、デフォルトの並べ替えアルゴリズムがグリッド全体に使用されていました。ただし、いくつかの列には特別な並べ替えが必要であり、グリッドでは特定の列のカスタム並べ替えが許可されていないため、グリッドの並べ替えを書き直す必要がありました。ここで問題となっている列は、特別な並べ替えを必要としなかったので、CompareTo を使用しました。

Public Function Compare(ByVal p1 as MyObj, ByVal p2 as MyObj) As Integer
    Return p1.Description.CompareTo(p2.Description)
End Function

デフォルトのグリッド ソート メソッドと、現在 CompareTo で使用しているメソッドを比較すると、まったく同じ結果が得られます。ただし、直接のデータベース クエリからの並べ替えの結果は異なります (データベースの結果が正しいと思われる場合)。

以下に、ソート結果が正しくないと思われる例を 3 つ示します。

例 1

ソート結果:

  1. テスト - A/A 私のテスト
  2. TEST1000 テスト
  3. TEST1000テスト
  4. テスト A テスト
  5. TEST-B/A 私のテスト

期待される結果:

  1. テスト - A/A 私のテスト
  2. TEST-B/A 私のテスト
  3. TEST1000 テスト
  4. TEST1000テスト
  5. テスト A テスト

例 2

ソート結果:

  1. テスト - テスト
  2. 試してください
  3. TEST-#1 A
  4. TEST-#1 B

期待される結果:

  1. 試してください
  2. テスト - テスト
  3. TEST-#1 A
  4. TEST-#1 B

例 3

ソート結果:

  1. ルイーズ テスト 1
  2. ルイーズ テスト 2
  3. ルイ - テスト 1

期待される結果:

  1. ルイ - テスト 1
  2. ルイーズ テスト 1
  3. ルイーズ テスト 2

誰かがこれに遭遇したことがありますか、またはここで何が起こっているのか考えていますか?

4

1 に答える 1

2

CompareToは大文字と小文字を区別し、カルチャに依存した並べ替えを行うため、アポストロフィやハイフンなどの文字は、厳密な文字エンコードの並べ替えではどこに表示されるかを示しません。これは期待していたようです。

StringComparisonを Ordinal として指定できるCompareのオーバーロードの使用を検討してください

于 2012-08-14T22:35:25.450 に答える