- - PR -
文字列のソート
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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 | ||||||||
|
投稿日時: 2007-08-03 11:06
いま Vista 環境がないのですが、 カルチャを変えてテストしたらどうなりますか? あと Vista だと、画順とかでも並びを変えられたような。 _________________ かるあ のメモ と スニペット | ||||||||
|
投稿日時: 2007-08-03 11:37
vistaはわかりません。XPでは単純な文字列比較ではないようです。
ファイル名の表示順序を変更する http://www.atmarkit.co.jp/fwin2k/win2ktips/342xpsort/xpsort.html | ||||||||
|
投稿日時: 2007-08-03 14:02
確実なのは自分でロジックを書くことでしょう。 System.IComparable.CompareTo メソッドや System.IComparer.Compare メソッドの利用目的のひとつだったりしますが。
_________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2007-08-03 22:07
Explorer と一緒じゃないと駄目というなら、レジストリエントリの名前から推測して StrCmpLogicalW を使えばいいのかな? 確証はないけど。
ただし XP 以降である必要があるし、レジストリの該当エントリを確認してどう設定しているか確認する必要もあるだろうけれども。 ていうか XP より前の場合は何使えばいいのやら。 | ||||||||
|
投稿日時: 2007-08-03 23:17
正解っぽい感じがしますね。 でも、今時ロケールの指定も出来ないなんて… プロセスやスレッドのロケールがバラバラだった時、どのロケールに基づいて文字列比較をするのやら。 | ||||||||
|
投稿日時: 2007-08-04 00:22
プロセスもスレッドも関係なく、 シェルのロケールを使うのではないでしょうか? ・shlwapi内の関数で、 ・そのshlwapi内には他にもStrCmpやStrCmpIなどがあり、 ・そのどれもがロケールを取らず、 ・StrCmpはロケール有りのバージョンが他にいくらでもある、 わけですから、 もうシェルのロケールを拾ってくれる以外に 私には考えられません。 違ったら裏切りですね。 | ||||||||
|
投稿日時: 2007-08-04 07:29
そうかなぁ? シェルそれ自身に「ロケールの設定」があるわけではないので、そのセンは薄いような気がするけどなぁ。 たかだか slwapi.dll が公開している関数なんで、わざわざ「起動中のシェルのロケールを取得」なんてしているとは思えないし…(してたらゴメン>作った人) 個人的にはせいぜい ・OSのデフォルトのロケール ・ログオンユーザのユーザ設定のロケール ・StrCmpLogicalW を使用するプロセスのロケール ・StrCmpLogicalW を使用するスレッドのロケール ・実はロケールなんか見てない のどれかじゃないかと思います。 最も問題なのは、それが StrCmpLogicalW のヘルプにドキュメントされていないことですね。 [ メッセージ編集済み 編集者: 渋木宏明(ひどり) 編集日時 2007-08-04 09:53 ] |