- PR -

文字列のソート

投稿者投稿内容
extream
ベテラン
会議室デビュー日: 2005/12/26
投稿数: 83
投稿日時: 2007-08-03 08:32
よろしくお願いします。

文字列をソートするため、IComparerを継承するクラスを作成し、以下のようにしました。

public int Compare(object x, object y)
{
// Data.data1、Data.data2の2種類のデータを持つ
  //
  Data d1 = (Data)x;
  Data d2 = (Data)y;
  result = String.Compare(d1.data1, d2.data1,StringComparison.Ordinal);
}


これを用いるとソートは行われているようなのですが、Explorerと異なるソート順になってしまいます。

エクスプローラは、以下の順で表示
 アイウEO2006
 アイウエオ2007
 あいうえお2005

ソート結果は以下
 アイウエオ2007
 アイウEO2006
 あいうえお2005


explorerと同じ結果を得ることは可能なのでしょうか?
ご存知の方いたら教えてください。

環境
VS2005 (C#)
WINDOWS VISTA
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2007-08-03 11:06
引用:

extreamさんの書き込み (2007-08-03 08:32) より:
コード:
public int Compare(object x, object y)
{
    // Data.data1、Data.data2の2種類のデータを持つ
    //
    Data d1 = (Data)x;
    Data d2 = (Data)y;
    result = String.Compare(d1.data1, d2.data1,StringComparison.Ordinal);
}




いま Vista 環境がないのですが、 カルチャを変えてテストしたらどうなりますか?
あと Vista だと、画順とかでも並びを変えられたような。
_________________
かるあ のメモスニペット
こあら
大ベテラン
会議室デビュー日: 2007/06/26
投稿数: 157
投稿日時: 2007-08-03 11:37
vistaはわかりません。XPでは単純な文字列比較ではないようです。

ファイル名の表示順序を変更する
http://www.atmarkit.co.jp/fwin2k/win2ktips/342xpsort/xpsort.html
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-08-03 14:02
確実なのは自分でロジックを書くことでしょう。 System.IComparable.CompareTo メソッドや System.IComparer.Compare メソッドの利用目的のひとつだったりしますが。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2007-08-03 22:07
Explorer と一緒じゃないと駄目というなら、レジストリエントリの名前から推測して StrCmpLogicalW を使えばいいのかな? 確証はないけど。
ただし XP 以降である必要があるし、レジストリの該当エントリを確認してどう設定しているか確認する必要もあるだろうけれども。
ていうか XP より前の場合は何使えばいいのやら。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-08-03 23:17
引用:

Explorer と一緒じゃないと駄目というなら、レジストリエントリの名前から推測して StrCmpLogicalW を使えばいいのかな? 



正解っぽい感じがしますね。
でも、今時ロケールの指定も出来ないなんて…

プロセスやスレッドのロケールがバラバラだった時、どのロケールに基づいて文字列比較をするのやら。
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-08-04 00:22
引用:

渋木宏明(ひどり)さんの書き込み (2007-08-03 23:17) より:
でも、今時ロケールの指定も出来ないなんて…

プロセスやスレッドのロケールがバラバラだった時、どのロケールに基づいて文字列比較をするのやら。




プロセスもスレッドも関係なく、
シェルのロケールを使うのではないでしょうか?

・shlwapi内の関数で、
・そのshlwapi内には他にもStrCmpやStrCmpIなどがあり、
・そのどれもがロケールを取らず、
・StrCmpはロケール有りのバージョンが他にいくらでもある、

わけですから、
もうシェルのロケールを拾ってくれる以外に
私には考えられません。

違ったら裏切りですね。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-08-04 07:29
引用:

プロセスもスレッドも関係なく、
シェルのロケールを使うのではないでしょうか?



そうかなぁ?

シェルそれ自身に「ロケールの設定」があるわけではないので、そのセンは薄いような気がするけどなぁ。

たかだか slwapi.dll が公開している関数なんで、わざわざ「起動中のシェルのロケールを取得」なんてしているとは思えないし…(してたらゴメン>作った人)

個人的にはせいぜい

・OSのデフォルトのロケール
・ログオンユーザのユーザ設定のロケール
・StrCmpLogicalW を使用するプロセスのロケール
・StrCmpLogicalW を使用するスレッドのロケール
・実はロケールなんか見てない

のどれかじゃないかと思います。

最も問題なのは、それが StrCmpLogicalW のヘルプにドキュメントされていないことですね。


[ メッセージ編集済み 編集者: 渋木宏明(ひどり) 編集日時 2007-08-04 09:53 ]

スキルアップ/キャリアアップ(JOB@IT)